2xx成功率需基于时间窗口内有效请求计算,排除3xx、纳入4xx、区分5xx来源,用awk按时间戳筛选并统计200–299状态码占比。

直接用日志统计 2xx 成功率,核心是准确提取状态码、限定时间范围、排除干扰项。不能只看总行数占比,否则会把历史积压或低频请求混进去,失真。
明确“成功率”的实际含义
生产中通常把 2xx 状态码请求占全部有效请求的比例 视为成功率。注意三点:
- 不建议包含 3xx(重定向)——它代表业务逻辑跳转,不是服务“成功响应”,容易掩盖真实问题;
- 不建议排除 4xx ——404、401 是常见业务错误,计入分母才反映真实可用性;
- 5xx 必须严格区分:如果是 $upstream_http_status(后端返回),说明代理失败;如果是 $status(Nginx 自身返回),可能是限流、超时或配置错误。
按时间窗口提取最近请求(关键一步)
日志是追加写入的,靠 tail -n 1000 容易漏掉高并发时段的请求。正确做法是用 awk 解析时间戳,取最近 60 秒数据:
假设日志格式为默认([01/Jan/2024:12:34:56 +0800]),运行:
awk -v cutoff="$(date -d '60 seconds ago' '+%d/%b/%Y:%H:%M:%S')" '$4 > "["cutoff {print $9}' /www/wwwlogs/example.com.log | sort | uniq -c
这条命令会筛选出时间戳晚于 60 秒前的所有请求的状态码,再做计数。
计算 2xx 成功率(带脚本示例)
把上面提取的状态码交给 awk 汇总,一行算出结果:
awk -v cutoff="$(date -d '60 seconds ago' '+%d/%b/%Y:%H:%M:%S')" '$4 > "["cutoff {s[$9]++; total++} END {for (i in s) if (i ~ /^2[0-9][0-9]$/) twos += s[i]; if (total > 0) printf "2xx 成功率: %.2f%\n", twos/total*100; else print "无新请求"}' /www/wwwlogs/example.com.log
输出类似:2xx 成功率: 98.32%
说明:它自动识别所有 200–299 范围的状态码,且只统计时间窗内数据,避免空值或旧日志干扰。
辅助判断是否异常
光看百分比不够,要结合分布看原因:
- 如果成功率突然跌到 90% 以下,立刻查 5xx 是否集中爆发;
- 若 2xx 高但 4xx 也飙升,可能是前端传参错误或接口文档未同步;
- 发现大量 206(Partial Content),需确认是否 CDN 或 Range 请求激增,属正常场景。


















