7.6.4 访问与错误日志关键指标

本节聚焦于访问日志与错误日志中的关键指标,旨在帮助运维人员快速判断服务状态、定位问题并指导容量规划。访问日志侧重业务流量与请求特征,错误日志侧重异常与系统状态;二者结合可形成完整的运行画像。

文章图片

一、访问日志关键指标(含配置与示例)
1. 日志格式与开启关键字段
- 配置文件示例(/etc/nginx/nginx.conf),包含常用性能字段:

http {
    log_format main_ext '$remote_addr $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        'rt=$request_time '
                        'uct=$upstream_connect_time '
                        'urt=$upstream_response_time '
                        'uht=$upstream_header_time';
    access_log /var/log/nginx/access.log main_ext;
}
  • 字段说明
    rt=Nginx总耗时,urt=上游响应耗时,uct=连接上游耗时,uht=上游首包时间。
  1. 请求量指标(QPS/PV/UV)
    - 按分钟QPS统计:
# 统计某分钟的请求数(QPS)
grep "20/Jun/2024:10:15" /var/log/nginx/access.log | wc -l
  • UV粗略统计(基于IP):
awk '{print $1}' /var/log/nginx/access.log | sort | uniq | wc -l
  1. 响应状态指标(2xx/3xx/4xx/5xx)
# 统计状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
  • 排错提示:4xx激增通常为接口滥用或参数错误;5xx激增多为后端异常或上游不可用。
  1. 性能与延迟指标(rt/urt/uct)
# 统计请求耗时超过1秒的请求
awk '$NF ~ /^urt=/ {split($NF,a,"="); if(a[2]>1) print $0}' /var/log/nginx/access.log | head
  • 诊断思路
    rt高且urt高:后端慢
    rt高而urt低:Nginx本地处理或网络问题
  1. 流量与带宽指标(body_bytes_sent)
# 统计当天总出流量(字节)
awk '{sum+=$10} END{print sum " bytes"}' /var/log/nginx/access.log
  1. 来源与分布指标(IP/UA/Referer)
# Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head

# Top 10 User-Agent
awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head

二、错误日志关键指标(含示例与排错)
1. 错误级别统计

# 统计错误级别
awk '{print $3}' /var/log/nginx/error.log | sort | uniq -c | sort -nr
  1. 典型错误与定位
    - upstream timed out:上游响应超时
    处理:检查后端耗时与连接数,必要时调大超时
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
  • connect() failed:上游连接失败
    处理:检查后端端口、健康检查、网络连通性
# 验证端口可达
nc -vz 10.0.0.10 8080
  • no live upstreams:上游全部不可用
    处理:检查 upstream 配置与后端状态

  • worker_connections are not enough:连接数耗尽
    处理:提高连接数与文件句柄

events {
    worker_connections 4096;
}
ulimit -n 65535

三、指标关联与诊断方法(关联示例)
- 高5xx + urt升高:后端性能问题
- 4xx突增 + 单IP集中:疑似恶意扫描
- QPS上升 + rt上升:容量不足或缓存失效
- 带宽上升 + 3xx增多:跳转链路异常或配置问题

四、安装与工具示例(GoAccess快速统计)

# 安装(CentOS/RHEL)
yum install -y epel-release
yum install -y goaccess

# 生成报表
goaccess /var/log/nginx/access.log \
  --log-format='%h %^ [%d:%t %^] "%r" %s %b "%R" "%u" rt=%T uct=%^ urt=%^ uht=%^' \
  --date-format='%d/%b/%Y' \
  --time-format='%H:%M:%S' \
  -o /tmp/nginx_report.html
  • 预期效果:生成HTML报表,可查看QPS、状态码、慢请求等指标。

五、常见排错步骤(基于日志)
1. 发现5xx激增 → 先查错误日志:

tail -n 200 /var/log/nginx/error.log
  1. 若出现 upstream timed out → 查慢请求:
awk '$NF ~ /^urt=/ {split($NF,a,"="); if(a[2]>1) print $0}' /var/log/nginx/access.log | head
  1. 若出现 connect() failed → 检查端口:
ss -tnlp | grep 8080

六、练习
1. 编写 log_format 增加 $request_length 字段,并统计请求体大于1MB的请求数。
2. 从访问日志中统计前10个5xx接口路径,并给出可能原因。
3. 通过错误日志定位一次 no live upstreams 的原因,给出修复方案。