nginx中为api网关配置专用错误日志收集与错误码分类统计,核心是分离日志输出、结构化记录关键字段,并借助awk/logstash/prometheus等工具聚合分析:先在server或location块中配置独立error_log路径与warn级别,再通过map指令标记4xx/5xx响应,结合定制access_log格式(含$status、$upstream_status等)记录异常请求,最后用awk按状态码分类统计或接入prometheus实现告警与可视化。

要在 Nginx 中为 API 网关配置专用错误日志收集与错误码分类统计,核心是分离日志输出、结构化记录关键字段,并借助外部工具(如 awk、logstash 或 Prometheus)做聚合分析。Nginx 本身不内置错误码统计功能,但可通过日志格式定制 + 日志切分 + 后处理实现精准归类。
定义专用错误日志文件与级别
避免混入主错误日志,单独为 API 网关设置 error_log 目标和最低捕获级别:
- 在对应 server 或 location 块中添加:error_log /var/log/nginx/api-gateway-error.log warn;(warn 级别可捕获 4xx/5xx 响应及配置异常)
- 若使用 stream 模块做 TCP/UDP 网关,需在 stream {} 上下文中配置 error_log,路径建议独立
- 确保目录可写、日志轮转已配置(如 logrotate),防止磁盘占满
自定义日志格式,嵌入状态码与上游信息
标准 error_log 不含 HTTP 状态码,需改用 access_log 记录“逻辑错误行为”,并配合 map 指令标记异常响应:
- 在 http 块中定义 map,将 4xx/5xx 映射为标记字段:
map $status $is_api_error {
~^[45] 1;
default 0;
} - 定义专用 access_log 格式,只记录异常请求:
log_format api_error '$time_iso8601 $remote_addr "$request" $status $body_bytes_sent $upstream_status $upstream_addr'; - 在 location 中启用该格式且仅记录异常:
access_log /var/log/nginx/api-errors.log api_error if=$is_api_error;
按错误码分类提取与基础统计
利用 shell 工具对日志实时或定时分析,无需部署额外服务即可获得分类结果:
- 统计最近 1 小时各状态码出现次数:
awk '$4 ~ /^[45]/ {count[$4]++} END {for (c in count) print c, count[c]}' /var/log/nginx/api-errors.log | sort -n - 区分网关层错误(如 502/503/504)与上游业务错误(如 400/401/404/500):
awk '$4 == "502" || $4 == "503" || $4 == "504" {g++} $4 ~ /^40[0-9]$|^500$/ {b++} END {print "gateway:", g, "backend:", b}' /var/log/nginx/api-errors.log - 结合 journalctl(systemd 环境)或 tail -f + grep 实现实时告警触发
对接 Prometheus 实现持续监控(可选进阶)
通过 nginx-lua-prometheus 或 nginx-module-vts 暴露指标,再由 Prometheus 抓取并按 status_code 标签聚合:
- 使用 lua-resty-prometheus,在 location 中埋点记录 status_code 标签维度的 counter
- 配置 Prometheus job 抓取 /metrics 接口,写 alert rule 如:
sum(rate(nginx_http_request_total{job="api-gateway",status_code=~"5.."}[5m])) > 10 - Grafana 中用「status_code」作为变量,构建错误码分布热力图或趋势折线图
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











