如何列出所有未被使用的AWS CloudWatch日志组?
列出未被使用的AWS CloudWatch日志组
这里的“未被使用”通常指最近一段时间(比如30天)无日志事件写入,或者从未生成过任何日志流,以下是几种可行的实现方法:
方法一:AWS CLI结合Shell脚本
通过CLI获取日志组列表,逐个检查日志流的最后活动时间,筛选符合条件的日志组:
# 设置阈值为30天,可根据需求调整 THRESHOLD_DAYS=30 # 转换为毫秒级时间戳(CloudWatch使用毫秒时间戳) THRESHOLD_TIMESTAMP=$(( ($(date +%s) - $THRESHOLD_DAYS*86400) * 1000 )) # 获取所有日志组名称 LOG_GROUPS=$(aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output text) for GROUP in $LOG_GROUPS; do # 获取该日志组最新的日志流最后写入时间 LAST_EVENT=$(aws logs describe-log-streams --log-group-name "$GROUP" --order-by LastEventTime --descending --limit 1 --query 'logStreams[0].lastEventTimestamp' --output text) # 无日志流,或最后写入时间早于阈值则标记为未使用 if [ -z "$LAST_EVENT" ] || [ "$LAST_EVENT" -lt "$THRESHOLD_TIMESTAMP" ]; then echo "未使用日志组: $GROUP" fi done
方法二:Python(boto3)脚本
利用AWS SDK遍历日志组,通过日志流的最后事件时间判断是否未被使用:
import boto3 from datetime import datetime, timedelta # 初始化CloudWatch Logs客户端 client = boto3.client('logs') # 设置30天阈值,可自定义 threshold = datetime.now() - timedelta(days=30) threshold_timestamp = int(threshold.timestamp() * 1000) # 分页获取所有日志组 paginator = client.get_paginator('describe_log_groups') for page in paginator.paginate(): for log_group in page['logGroups']: group_name = log_group['logGroupName'] # 获取该日志组最新的日志流 streams = client.describe_log_streams( logGroupName=group_name, orderBy='LastEventTime', descending=True, limit=1 )['logStreams'] if not streams: print(f"未使用日志组(无日志流): {group_name}") continue last_event_time = streams[0].get('lastEventTimestamp', 0) if last_event_time < threshold_timestamp: print(f"未使用日志组(超过30天无写入): {group_name}")
方法三:CloudWatch控制台可视化筛选
通过CloudWatch指标直接筛选无日志流入的日志组:
- 打开CloudWatch控制台,进入指标页面
- 选择
Logs命名空间,找到LogGroup维度下的IncomingLogEvents指标 - 添加所有日志组的该指标,设置时间范围为目标周期(如30天),筛选出指标值始终为0的日志组
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

