需结构化nginx日志以监控api调用频次与开放平台使用率:统一用$uri归一化接口路径,定义api_log格式并应用于/api/等location;通过awk按接口+方法+调用方多维聚合,支持分钟级请求数、小时成功率、失败归因及阈值告警。

要通过 Nginx 访问日志监控 API 接口调用频次和开放平台使用率,核心是让日志“可归一、可过滤、可聚合”——不是简单记录原始请求,而是结构化提取接口路径、方法、状态、来源等关键维度,再结合时间窗口与业务标识做分层统计。
规范日志格式,确保接口路径统一归一化
默认 combined 日志中 $request 包含完整 URL(含 query string),会导致同一接口因参数不同被记为多条路径(如 /api/user?id=1 和 /api/user?id=2 被视为两个接口)。应改用 $uri 字段,它已解码且不含查询参数:
- 在
http块中定义专用日志格式:log_format api_log '$remote_addr - $remote_user [$time_local] "$request_method $uri $http_version" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $http_x_api_key'; - 将该格式用于 API 所在的
location /api/或location ~ ^/v[0-9]+/块,避免混入静态资源日志 - 重载 Nginx 后,每条日志第 4 字段(
$uri)稳定为/api/users,不随参数变化
按维度拆解调用频次:接口 + 方法 + 调用方
开放平台使用率不仅要看总量,更要区分谁在调、怎么调、调什么。日志中已有字段可支撑多维下钻:
-
接口级高频路径(含方法):
awk '$9 >= 200 && $9 <br>输出示例:<code>1842 POST /api/order/create、1276 GET /api/user/profile -
调用方识别(如 API Key):若日志中记录了
$http_x_api_key(第 13 字段),可统计各 Key 调用量:awk '$9 >= 200 && $4 ~ /^\/api\// {key = $13; if (key != "-") count[key]++} END {for (k in count) print count[k], k}' /var/log/nginx/api.log | sort -nr | head -10 -
失败调用归因:单独筛选 4xx/5xx 请求,按
$uri和$http_user_agent聚合,快速定位是客户端误用还是服务异常
按时间粒度观察使用节奏
开放平台调用常有周期性(如定时任务、前端轮询),分钟级或小时级统计比总量更有业务意义:
-
每分钟请求数(取日志第 2 字段时间戳):
awk '{gsub(/\[|:/," ",$2); print substr($2,1,2) " " substr($2,4,2) ":" substr($2,6,2)}' /var/log/nginx/api.log | sort | uniq -c | sort -nr | head -10
输出类似:382 14:23、367 14:22 -
每小时成功调用占比:
awk '{gsub(/\[|:/," ",$2); hour = substr($2,1,2); if ($9 >= 200 && $9
轻量接入监控闭环:从日志到告警
不依赖重型组件也能快速建立反馈链路:
- 用
tail -f+awk实时监听突增(如某接口 10 秒内超 50 次):tail -f /var/log/nginx/api.log | awk '$4 ~ /^\/api\/order\/create$/ && $9 >= 200 {c++; if (systime() - t > 10) {t = systime(); c = 1} if (c > 50) print "ALERT: order/create burst at", $2}' - 将清洗后的指标写入临时文件,由 Prometheus 的
textfile_collector定期读取,实现零侵入暴露指标 - 对高频失败路径(如连续 5 分钟 401 超 20%),用脚本触发邮件或企业微信通知
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











