使用Python高效解析结构化日志并统计异常事件
在现代系统运维和应用监控中,日志是诊断问题的核心数据源。面对每秒生成数千行的海量日志,人工筛查已不可行。Python 凭借其强大的文本处理能力,成为自动化日志分析的首选工具。
本例以标准的 Apache 风格访问日志为样本,展示如何通过正则表达式精准提取关键字段,并实现异常级别统计。日志格式如下:
192.168.1.10 - - [15/Apr/2024:08:23:11 +0000] "GET /api/user HTTP/1.1" 200 1245
192.168.1.15 - - [15/Apr/2024:08:24:03 +0000] "POST /login HTTP/1.1" 500 89
192.168.1.22 - - [15/Apr/2024:08:25:17 +0000] "GET /static/css/main.css HTTP/1.1" 404 412
192.168.1.10 - - [15/Apr/2024:08:26:09 +0000] "GET /api/data HTTP/1.1" 200 3012
192.168.1.33 - - [15/Apr/2024:08:27:33 +0000] "DELETE /admin/user/123 HTTP/1.1" 403 210
目标字段包括:客户端IP、请求方法、请求路径、HTTP状态码、响应大小。我们构建一个灵活的解析器,仅用单次正则匹配即可捕获全部结构化信息。
import re
from collections import Counter
# 定义日志行匹配模式:精确匹配 Apache 格式
log_regex = r'^(\S+) \S+ \S+ \[(.*?)\] "(\w+) (\S+) \S+" (\d{3}) (\d+)'
# 初始化统计容器
status_codes = Counter()
error_paths = []
# 读取并处理日志文件
with open('access.log', 'r', encoding='utf-8') as log_file:
for line in log_file:
match = re.search(log_regex, line.strip())
if match:
ip, timestamp, method, path, status, size = match.groups()
status = int(status)
# 记录错误状态码及对应路径
if status >= 400:
error_paths.append((path, status))
# 统计状态码分布
status_codes[status] += 1
# 输出统计结果
print("=== HTTP 状态码统计 ===")
for code, count in sorted(status_codes.items()):
print(f"{code}: {count} 次")
print("\n=== 错误路径列表 ===")
for path, code in error_paths:
print(f"{code} {path}")
运行后输出:
=== HTTP 状态码统计 ===
200: 2
403: 1
404: 1
500: 1
=== 错误路径列表 ===
500 /login
404 /static/css/main.css
403 /admin/user/123
此方案具备良好的扩展性。若需支持 JSON 日志或多行日志,只需替换正则表达式与读取逻辑,核心架构保持不变。结合 Pandas 可导出为结构化数据表,接入监控看板或告警系统,实现自动化运维闭环。