访问日志(access.log)记录用户请求行为,错误日志(error.log)定位系统级故障;前者含IP、时间、请求行、状态码、耗时等字段,后者含级别、错误原因及上下文,需结合tail/grep/awk等命令高效排查。

直接看日志内容前,先确认你面对的是哪类日志:访问日志(access.log)记录“谁来了、做了什么、结果如何”,错误日志(error.log)记录“哪里出错了、为什么失败、服务本身是否异常”。两者分工明确,不能混用,也不能只盯一个。
怎么看 access.log —— 理解用户请求行为
一条典型的访问日志行类似这样:
192.168.1.100 - - [28/Aug/2026:19:45:22 +0000] "GET /api/users HTTP/1.1" 200 1428 "https://admin.example.com" "Mozilla/5.0 (Macintosh)" 0.032 0.029
关键字段含义如下:
-
$remote_addr:发起请求的 IP。注意:若前面有 CDN 或反向代理,它显示的是上一级地址,真实 IP 需查
$http_x_forwarded_for或通过map提取 - $time_local:请求到达 Nginx 的本地时间,含时区,可用于排查时间相关问题(如缓存失效、定时任务)
- $request:完整请求行,含方法(GET/POST)、路径、协议,是定位具体接口或资源的第一线索
- $status:HTTP 状态码。重点盯住 4xx(客户端问题,如 404 路径错、403 权限拒、429 频率限)和 5xx(服务端问题,如 502 upstream 挂了、504 gateway timeout)
- $body_bytes_sent:响应体大小(不含响应头),突增可能意味大文件下载,突降可能说明返回空或被截断
- $request_time 和 $upstream_response_time:前者是 Nginx 处理总耗时,后者是后端实际响应耗时。若前者远大于后者,瓶颈可能在 Nginx 自身(如 SSL 握手、大 body 解析);若两者接近且都高,问题大概率在后端服务
怎么看 error.log —— 定位系统级故障根源
错误日志不支持自定义格式,但级别丰富,每行开头带时间戳和级别标识,例如:
2026/08/28 19:44:17 [error] 12345#12345: *6789 connect() failed (111: Connection refused) while connecting to upstream, client: 203.0.113.5, server: api.example.com, request: "POST /v1/submit HTTP/1.1", upstream: "http://127.0.0.1:8080", host: "api.example.com"
这类日志的关键信息包括:
-
日志级别:如
[error]、[warn]、[crit]。生产环境建议设为warn或error,避免 info/debug 级别淹没关键信号 -
错误类型与原因:如
Connection refused(后端进程未启动)、Permission denied(文件权限或 SELinux 限制)、no live upstreams(upstream 全挂)、SSL_do_handshake() failed(证书或协议不兼容) - 上下文信息:client IP、server name、request 行、upstream 地址、host 头等,能快速还原故障现场,尤其对 502/504 类错误至关重要
-
配置类报错:如
nginx: [emerg] unknown directive "xxx"或nginx: configuration file /etc/nginx/nginx.conf test failed,说明 reload 失败,需立即检查语法
实用查看技巧与避坑提醒
日常排查不靠肉眼扫全量,而是结合命令快速聚焦:
- 查最近高频错误:
tail -n 100 /var/log/nginx/error.log | grep -E "(error|crit|alert)" - 查特定状态码请求:
awk '$9 == "502" {print}' /var/log/nginx/access.log | head -20 - 查慢请求(>1秒):
awk '$NF > 1 {print $0}' /var/log/nginx/access.log | sort -k10 -nr | head -10(假设$request_time是第10字段) - 别用
cat access.log | grep xxx查实时流——改用tail -f /var/log/nginx/access.log | grep "POST" - 切记:不要手动
rm access.log或echo "" > access.log清空日志,Nginx 会因文件句柄失效停止写入;应使用logrotate或nginx -s reopen重新打开日志文件


















