深色模式
grep/awk 日志分析实战
没有可视化平台时,命令行就是最快的日志分析工具。本文用 nginx access log 统计 5xx 数量、慢请求 Top IP,适合线上临时排障。
适用环境
bash
# 确认日志格式(combined)与行结构
head -n 2 /var/log/nginx/access.log
# combined 示例:IP - - [时间] "GET /x 200" 0.123 "ua"1
2
3
2
3
操作步骤
1. 统计 5xx 错误数
bash
grep -E ' (5[0-9]{2}) ' /var/log/nginx/access.log | wc -l
# 按小时聚合
grep -E ' (5[0-9]{2}) ' access.log | awk '{print $4}' | cut -d: -f2 | uniq -c1
2
3
2
3
2. 找出慢请求(响应时间 > 1s)
bash
# 假设最后一列是 $request_time
awk '$NF>1 {print $NF, $0}' access.log | sort -rn | head -n 201
2
2
3. 统计每个 IP 的请求数与 5xx 占比
bash
awk '{ip=$1; code=$9; cnt[ip]++; if(code>=500 && code<600) err[ip]++} END{for(i in cnt) printf "%s total=%d 5xx=%d\n", i, cnt[i], err[i]+0}' access.log | sort -t= -k2 -rn | head1
4. 实时盯错误
bash
tail -f access.log | grep --line-buffered ' 5[0-9][0-9] '1
验证
bash
# 随机抽一条 5xx 看上下文
grep -E ' (5[0-9]{2}) ' access.log | head -n 11
2
2
常见坑
WARNING
awk 的字段序号依赖日志格式。combined 中状态码是第 9 个字段;若你改过 log_format,字段位置会变,先用 head | awk '{print NF, $0}' 确认。
DANGER
对几十 GB 的大文件反复 grep 会很慢且吃 IO,影响线上。尽量限定时间区间或用 zcat 处理已压缩的历史文件。