从访问日志里找出事故时刻
目标
从一份 1269 行的访问日志中,在 10 分钟内找出事故时间和问题路径,并将激增幅度与日常基线比较,用数字描述。
为什么重要
“有 103 个错误”不算信息。如果平时只有 5 个,就很严重;如果平时有 120 个,反而说明有所改善。因此,日志分析不是从寻找原因开始,而是从建立基线开始。陌生客户通常没有基线文档,所以必须从同一份日志中建立:排除事故区间后的其余部分就是日常基线。
还必须分别查看 4xx 和 5xx。4xx 表示客户端发送错误,5xx 表示服务器发生故障,两类数值是同步变化还是各自变化,会指明原因方向。部署后如果只有 4xx 增加,说明 API 契约发生变化;如果只有 5xx 增加,则说明内部系统出现故障。
/opt/data/web.log 的格式是以空格分隔的五个字段。
10.9.4.21 04:52:15 GET /api/pay 200
IP 시각 메서드 경로 상태코드
步骤
- 创建
/root/incident目录。 - 将状态码为 500 的请求总数写入
/root/incident/total_500.txt。 - 将状态码为 404 的请求总数写入
/root/incident/total_404.txt。 - 找出 500 出现次数最多的分钟,以
HH:MM格式写入/root/incident/peak_minute.txt。 - 将 500 出现次数最多的路径写入
/root/incident/endpoint.txt。 - 将该峰值一分钟内发生的 500 数量写入
/root/incident/peak_count.txt。 - 将排除峰值分钟后其余时间段的 500 数量写入
/root/incident/baseline.txt。 - 在
/root/incident/summary.txt中编写包含上述四个值的摘要。
参考
awk '$5==500' /opt/data/web.log | wc -l- 按分钟汇总:
awk '$5==500 {print substr($2,1,5)}' /opt/data/web.log | sort | uniq -c | sort -rn | head - 路径分布:
awk '$5==500 {print $4}' /opt/data/web.log | sort | uniq -c | sort -rn - 常见错误 1:第 4 步写入完整的
HH:MM:SS。按秒切分会使分布散开,无法看到峰值。 - 常见错误 2:第 7 步减去整个日志的行数。应减去的是峰值分钟内的 500 数量。
创建工作目录
创建 /root/incident 目录。
将分析结果集中放在 /root/incident 下。
统计 500 总数
将状态码为 500 的请求总数写入 /root/incident/total_500.txt。
web.log 的最后一个字段是状态码。使用 awk 只统计该字段为 500 的行。
统计 404 总数
将状态码为 404 的请求总数写入 /root/incident/total_404.txt。
4xx 与 5xx 的原因不同。要判断它们是同步变化还是各自变化,必须分别统计。
找出事故时间
找出 500 出现次数最多的分钟,以 HH:MM 格式写入 /root/incident/peak_minute.txt。
第二个字段是 HH:MM:SS。只截取前 5 个字符,找出 500 最集中的分钟。
找出问题路径
将 500 出现次数最多的路径写入 /root/incident/endpoint.txt。
只选择状态码为 500 的行,查看第四个字段的分布。判断错误是集中在一个路径还是分散出现。
统计峰值分钟的错误数
将该峰值一分钟内发生的 500 数量写入 /root/incident/peak_count.txt。
统计只在该一分钟内出现了多少个 500。直接利用前一步的结果。
计算日常错误量
将排除峰值分钟后其余时间段的 500 数量写入 /root/incident/baseline.txt。
这是排除峰值分钟后其余时间段的 500 数量。用总数减去峰值即可。
创建分析摘要
在 /root/incident/summary.txt 中编写包含上述四个值的摘要。
将 500 总数、事故时间、问题路径和日常基线四项集中到一个文件中。