如何在CloudWatch Log Insights或Python中分组统计相似错误日志?
问题描述
我通过boto3查询CloudWatch Log Insights,获取了约10000条日志(因隐私无法提供真实日志)。当前使用的Log Insights查询语句为:
filter @message like /ERROR/
返回的日志格式如下:
timestamp:ERROR <some details>Apache error....<error details> timestamp:ERROR <some details>Connection error.... <error details> timestamp:ERROR <some details>Database error....<error details>
需要将包含相似子串的错误(如Apache error、Connection error、Database error等)进行分组,并统计每组的数量,期望输出如下:
Apache error 130 Database error 2253 Connection error 3120
请问能否通过正则或其他方式提取相似子串,在Log Insights或Python中实现分组统计?
方案一:直接在CloudWatch Log Insights中实现
可以利用Log Insights的parse命令结合正则提取错误类型,再通过stats命令分组统计。
查询语句示例
filter @message like /ERROR/ | parse @message /(\w+\s?\w+ error)/ as error_type | stats count(*) as error_count by error_type | sort error_count desc
说明
- 正则
/(\w+\s?\w+ error)/可匹配"Xxx error"或"Xxx Yyy error"这类格式的错误类型,可根据实际日志的错误子串格式调整正则规则(比如错误类型包含更多单词时,可修改为/([A-Za-z\s]+ error)/); stats count(*) by error_type会按提取出的错误类型分组统计数量,最后按数量降序排序输出。
方案二:Python(结合boto3)处理
如果已经通过boto3获取到日志数据,可以用Python正则匹配+频次统计工具实现分组计数。
示例代码
import re from collections import Counter # 假设logs是通过boto3获取的日志列表,每个元素为日志的@message内容 logs = [ "timestamp:ERROR <some details>Apache error....<error details>", "timestamp:ERROR <some details>Connection error.... <error details>", "timestamp:ERROR <some details>Database error....<error details>", # 更多日志数据... ] # 定义匹配错误类型的正则,按需调整 pattern = re.compile(r'(\w+\s?\w+ error)') error_types = [] for log in logs: match_result = pattern.search(log) if match_result: error_types.append(match_result.group(1).strip()) # 统计各错误类型的数量 error_stats = Counter(error_types) # 格式化对齐输出 print(f"{'错误类型':<20} {'数量'}") for error_type, count in sorted(error_stats.items(), key=lambda x: -x[1]): print(f"{error_type:<20} {count}")
说明
- 正则规则可根据日志的实际格式灵活修改,比如错误子串前后有固定标识时,可针对性优化匹配逻辑;
collections.Counter能高效统计列表中元素的出现频次,最后按数量降序排序输出,保证结果和期望格式一致。
内容的提问来源于stack exchange,提问作者Devang Sanghani
相关产品推荐
相关产品推荐

