nginx统计api成功率需先定义含$status等字段的log_format,将api日志独立输出,再通过awk、prometheus等工具按成功/总请求数计算;注意$status为nginx返回码而非上游真实状态,重定向是否计入需按业务约定。

在 Nginx 中统计 API 调用成功率,核心是利用 log_format 定义日志格式,结合状态码($status)区分成功与失败请求,再通过日志分析工具(如 awk、GoAccess、ELK 或 Prometheus + nginx-vts-exporter)做聚合计算。关键不在于“一次性算出成功率”,而在于记录足够信息供后续统计。
定义包含关键字段的 log_format
成功率 = 成功请求数 / 总请求数,因此日志中至少需记录状态码和请求路径(便于按 API 聚合)。推荐定义如下格式:
log_format api_metrics '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
说明:
-
$status是 HTTP 状态码,2xx/3xx 通常视为成功(可根据业务约定调整,比如只把 2xx 当成功) -
$request包含方法和路径,可用于提取 API 接口名(如GET /v1/users HTTP/1.1→/v1/users) -
$request_time和$upstream_response_time可辅助分析慢请求对成功率的影响(例如超时导致 504)
将日志写入独立文件并启用 access_log
避免干扰默认日志,为 API 单独配置日志输出:
location ^~ /api/ {
access_log /var/log/nginx/api_access.log api_metrics;
proxy_pass http://backend;
}
注意:
- 使用
^~前缀确保前缀匹配优先于正则,适合 RESTful API 路径 - 若 API 分散在不同 location,可统一用
map指令标记 API 请求,再基于变量分流日志
用脚本或工具统计成功率
日志本身不计算,需外部处理。常用方式:
-
实时简单统计(调试用):
awk '$9 ~ /^2/ {s++} {t++} END {printf "Success Rate: %.2f%\n", s/t*100}' /var/log/nginx/api_access.log
(假设状态码在第9字段,按空格分割;实际需根据 log_format 字段顺序调整) -
按接口分组统计:
awk '{match($4, /"[A-Z]+ ([^"]+)/, m); path=m[1]; if ($9 ~ /^2/) success[path]++; total[path]++} END {for (p in total) printf "%s: %.1f%%\n", p, success[p]/total[p]*100}' /var/log/nginx/api_access.log -
对接监控系统:用 nginx-lua-prometheus 或 nginx-module-vts 暴露指标,Prometheus 抓取后用
rate(nginx_http_request_total{code=~"2.."}[5m]) / rate(nginx_http_request_total[5m])计算成功率
注意事项与常见陷阱
直接依赖 Nginx 日志统计成功率,需留意边界情况:
-
$status是 Nginx 返回给客户端的状态,不是上游真实响应码(如 upstream timeout 会记为 504,但后端可能已处理成功) - 重定向(301/302)是否算成功?需按业务定义,日志中无法自动区分语义
- 日志滚动或权限问题会导致数据丢失,生产环境建议配合 logrotate 并校验归档完整性
- 高频 API 场景下,纯文本日志分析性能不足,应考虑接入 Kafka + Flink 或直接用 OpenTelemetry 上报指标
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











