← 中文资源

简体中文版本

从访问日志挖掘状态码与延迟异常

仅用 jq、awk 与 sort 把访问日志变成错误率、慢路径与可疑客户端的排名表,快速定位异常模式。

阅读英文原文

目标

回答“哪个端点坏了、对谁坏的”不需要指标平台。JSON 访问日志加三个 shell 工具就能在几秒内产出排名表:每条路径的错误数、最慢请求、最吵的客户端。这通常足以在仪表盘加载完之前把事故路由给正确的负责人。

步骤要点

  1. 用 jq 过滤 status≥500 并统计 uri 出现次数,降序排前 15,通常一条路径远高于其余。
  2. 把总请求数与错误数按端点联立,得到错误率而非裸计数,区分“繁忙但健康”与“量小但全坏”。
  3. 按 request_time 降序取前 10,慢 URI 连同查询串一起暴露,昂贵的参数一目了然。
  4. 统计 client 出现次数排名,单地址每小时数万请求多半是爬虫或卡死的重试循环。
  5. 专查 5xx 里的客户端分布:同一客户端占大多数 5xx 行,就是无退避重试循环在放大故障。

排错提示

日志是 combined 格式就先切 JSON log_format,否则 jq 无从下手;URI 带资源 id 会让每行都唯一,先用 sed 把数字段归一成 /orders/ID 再统计;request_time 缺失说明日志格式没配该变量,补上 $request_time 与 $upstream_response_time 后等新流量再分析。

适用边界

访问日志只覆盖成功解析的请求,在记录之前被拒绝的请求不可见;延迟字段只测服务端耗时,不含客户端网络与渲染时间。

代码示例

# Endpoints ranked by 5xx count
jq -r 'select(.status >= 500) | .uri' access.log \
  | sort | uniq -c | sort -rn | head -15

# Slowest requests with their query strings
jq -r '(.request_time|tostring) + " " + .uri' access.log \
  | sort -rn | head -10