核心是用awk一行统计指定接口失败率:先提取匹配路径的总请求数和4xx/5xx失败数,再计算整数百分比并与阈值比较;支持多方法、路径前缀匹配及时间范围过滤,并可封装为定时监控脚本。

要统计特定接口调用失败率是否超过预设百分比,核心是:分别算出该接口的总请求数和其中失败请求(如 4xx/5xx)数,再计算比值并对比阈值。整个过程不依赖外部工具,纯靠 awk 一行完成判断。
确认日志中字段位置与接口路径格式
Apache 或 Nginx 日志里,关键字段通常是:
- 请求行(含方法 + 路径)在
$7(Apachecombined格式)或$request字段(Nginx 默认$request对应第 7 列) - 状态码在
$9(Apache/Nginx 默认配置下都是第 9 列)
先用 head -1 access.log 看一眼,确认:
- 第 7 列是否为
"GET /api/v2/users HTTP/1.1"这类完整请求行 - 第 9 列是否为纯数字状态码(如
200、404、500)
统计指定接口的失败率(以 /api/v2/users 为例)
运行以下命令,将 5 替换为你设定的阈值(单位:百分比):
awk -v threshold=5
'$7 ~ /"GET /api/v2/users/ {total++; if ($9 ~ /^4[0-9]{2}$|^5[0-9]{2}$/) failed++}
END {
if (total == 0) { print "WARN: no matching requests found"; exit 1 }
rate = total > 0 ? int(failed/total*100) : 0
if (rate > threshold)
print "ALERT: failure rate is " rate "% (> " threshold "%)"
else
print "OK: failure rate is " rate "% (≤ " threshold "%)"
}' /var/log/apache2/access.log说明:
-
total++累加所有匹配该接口的请求 -
failed++只在状态码是4xx或5xx时触发 -
int(...)取整便于阅读(也可用sprintf("%.1f", ...)保留小数) -
total == 0防止除零错误,并给出明确提示
✅ 示例输出:
ALERT: failure rate is 8% (> 5%)
✅ 若无匹配请求:WARN: no matching requests found
扩展支持多种 HTTP 方法和路径模糊匹配
如果接口可能被 POST、PUT 调用,或带查询参数(如 /api/v2/users?role=admin),可放宽匹配条件:
$7 ~ /"(GET|POST|PUT) \/api\/v2\/users/
若只想匹配路径前缀(忽略参数),用更稳健的方式提取路径:
$7 ~ /"(GET|POST)/ {
match($7, /"[A-Z]+ ([^[:space:]]+)/, arr)
path = arr[1]
if (path ~ /^/api/v2/users/) {
total++
if ($9 ~ /^4[0-9]{2}$|^5[0-9]{2}$/) failed++
}
}这样能避开 ? & 等特殊字符干扰,也适配 URL 编码场景。
加入时间范围限制(比如最近一小时)
若日志含标准时间字段(如 $4 是 [14/Jul/2026:13:xx:xx),可加时间过滤:
$4 ~ /[14/Jul/2026:13:[0-5][0-9]:/ && $7 ~ /"GET /api/v2/users/
确保日期格式与你日志一致(Jul 还是 July?2026 还是 26?先 head -1 确认)。
不复杂但容易忽略:真正上线监控时,建议把这行命令封装成脚本,加上 -v file="/path/to/log" 参数支持动态日志路径,并配合 cron 每5分钟执行一次,异常时 echo ... | mail -s "API Alert" 推送告警。

















