You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:53:01