如何删除X天未操作的AWS Log Groups?获取30天无写入日志组列表
关于AWS Log Groups的 stale 日志组处理方案
我来帮你梳理下这两个问题的实操方案,不管是获取列表还是批量删除,用AWS CLI或者Python脚本都能轻松搞定:
1. 如何删除X天内未被操作过的AWS Log Groups?
这里的“未被操作过”通常指没有日志写入(对应日志组的lastEventTime字段),如果是指配置修改的话会复杂很多,一般用户需求都是针对无日志写入的情况。下面分两种方式实现:
方式一:AWS CLI + jq 快速操作
适合临时执行,步骤清晰:
# 第一步:计算X天前的UTC时间戳(毫秒,因为AWS用毫秒级时间戳) # 把下面的30改成你需要的X天 X_DAYS_AGO=$(date -u -d "-30 days" +%s)000 # 第二步:获取所有符合条件的日志组名称,输出到文本文件 aws logs describe-log-groups --query 'logGroups[?lastEventTime <= `'"$X_DAYS_AGO"'`].logGroupName' --output text | tr '\t' '\n' > stale_log_groups.txt # 第三步:遍历删除日志组 while IFS= read -r log_group; do echo "正在删除日志组: $log_group" aws logs delete-log-group --log-group-name "$log_group" done < stale_log_groups.txt
注意:如果要排除从未写入过日志的日志组(这类日志组没有
lastEventTime字段),可以把查询条件改成logGroups[?lastEventTime != null && lastEventTime <='"$X_DAYS_AGO"'].logGroupName
方式二:Python + Boto3 脚本(更灵活)
适合需要批量处理大量日志组的场景,自动处理分页(AWS CLI默认返回最多50个日志组,超过需要手动分页,脚本会自动处理):
import boto3 from datetime import datetime, timedelta def delete_stale_log_groups(days=30): # 初始化AWS Logs客户端 logs_client = boto3.client('logs') # 计算截止时间(毫秒级UTC时间戳) cutoff_timestamp = (datetime.utcnow() - timedelta(days=days)).timestamp() * 1000 # 分页获取所有日志组 paginator = logs_client.get_paginator('describe_log_groups') for page in paginator.paginate(): for log_group in page['logGroups']: last_event_time = log_group.get('lastEventTime') # 条件:要么从未写入过日志,要么最后写入时间早于截止时间 if not last_event_time or last_event_time <= cutoff_timestamp: log_group_name = log_group['logGroupName'] print(f"删除 stale 日志组: {log_group_name}") logs_client.delete_log_group(logGroupName=log_group_name) if __name__ == "__main__": # 这里传入你需要的天数,比如删除7天无写入的日志组就改成days=7 delete_stale_log_groups(days=30)
2. 是否有办法删除过去30天内无写入操作的所有AWS Log Groups?或者反过来,获取该类日志组的列表?
当然可以,其实就是上面方案的拆分:
先获取30天无写入的日志组列表
CLI方式:
THIRTY_DAYS_AGO=$(date -u -d "-30 days" +%s)000 # 输出为表格格式,更易读 aws logs describe-log-groups --query 'logGroups[?lastEventTime <= `'"$THIRTY_DAYS_AGO"'`].logGroupName' --output table # 或者输出为文本列表 aws logs describe-log-groups --query 'logGroups[?lastEventTime <= `'"$THIRTY_DAYS_AGO"'`].logGroupName' --output text | tr '\t' '\n'
Python脚本方式(只打印不删除):
import boto3 from datetime import datetime, timedelta def get_stale_log_groups(days=30): logs_client = boto3.client('logs') cutoff_timestamp = (datetime.utcnow() - timedelta(days=days)).timestamp() * 1000 stale_groups = [] paginator = logs_client.get_paginator('describe_log_groups') for page in paginator.paginate(): for log_group in page['logGroups']: last_event_time = log_group.get('lastEventTime') if not last_event_time or last_event_time <= cutoff_timestamp: stale_groups.append(log_group['logGroupName']) print("过去30天无写入的日志组列表:") for group in stale_groups: print(f"- {group}") return stale_groups if __name__ == "__main__": get_stale_log_groups(days=30)
删除30天无写入的日志组
直接用第一个问题里的方案,把天数改成30即可。建议先获取列表确认无误后再执行删除,避免误删重要日志!
额外注意事项
- 权限要求:执行操作的IAM用户/角色需要拥有
logs:DescribeLogGroups和logs:DeleteLogGroup权限。 - 时区问题:一定要用UTC时间计算截止时间(上面的命令和脚本都用了UTC),因为AWS日志组的
lastEventTime是UTC时间,避免时区差异导致过滤错误。 - 测试验证:首次操作时,建议只执行获取列表的步骤,确认结果符合预期后再删除。
内容的提问来源于stack exchange,提问作者Kousha
相关产品推荐
相关产品推荐

