nginx 日志可通过 awk 等标准工具快速统计 http 状态码占比,需确保 log_format 包含 $status 字段;单次统计常用 awk 提取第 9 字段(状态码),再经 sort、uniq -c 和 sort -nr 排序汇总。

直接通过 Nginx 自带日志配合标准工具(如 awk、sort、grep)或轻量级脚本,就能快速统计各 HTTP 状态码的占比及变化趋势,无需引入复杂系统。
确认日志格式是否包含状态码
Nginx 默认 log_format 已包含 $status 字段(即响应状态码),例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';若自定义格式中缺失 $status,需补上并重载配置(nginx -s reload)。
单次统计:查看某时段状态码分布
以访问日志 /var/log/nginx/access.log 为例,用一行命令提取最近 1 小时的状态码占比:
- 先按时间筛选(假设日志时间格式为
[01/Jan/2024:10:):awk -F'[' '/\[.*:$(date -d "1 hour ago" +%H):/ {print $2}' /var/log/nginx/access.log | cut -d']' -f1 | cut -d' ' -f9 | sort | uniq -c | sort -nr - 更通用且推荐的方式(直接提取所有状态码并统计):
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '{total += $1} END {for (i=1;i
输出类似:12450 200 78.32%<br>1892 404 11.90%<br>765 500 4.81%
对比分析:观察状态码占比变化
要看出“变化”,关键在于分时段采样并横向对比。例如分别统计今天和昨天的每小时状态码分布:
- 生成两份按小时+状态码聚合的数据:
awk -F'[' '{dt=substr($2,1,13); gsub(/[^0-9]/,"_",dt); print dt, $9}' /var/log/nginx/access.log | sort | uniq -c | awk '{print $2,$3,$1}' > status_hourly.log - 用 Excel 或简单脚本(如 Python pandas)加载后,pivot 表按小时为行、状态码为列、计数为值,再添加百分比列即可观察波动
- 重点关注突增的 4xx(如 400/401/429)或 5xx(如 502/504),它们往往对应上游异常、鉴权失败或限流触发
自动化建议:轻量级监控思路
不一定要上 ELK,用 cron + shell 就能实现基础趋势跟踪:
- 每小时执行一次统计,结果追加到 CSV 文件:
echo "$(date +%F_%H),$(awk '{s[$9]++} END {for (i in s) printf "%s:%d ",i,s[i]; print ""}' /var/log/nginx/access.log)" >> /data/status_trend.csv - 配合 gnuplot 或 Python matplotlib,每周生成一张状态码热力图(横轴小时、纵轴状态码、颜色深浅代表占比)
- 对 5xx 超过 1% 或 429 单小时超 500 次,可触发邮件告警(用 mail 或 curl 调用 webhook)











