Nginx 日志格式“异常”通常不是 Nginx 本身出 bug,而是配置、变量或运行环境导致日志内容不符合预期。下面按常见原因分类说明,并给出排查方法。
log_format 配置问题log_format main '$remote_addr $http_x_forwarded_for $unknown_var';
如果 $unknown_var 不存在,会输出空或 -。
✅ 解决:
错误示例:
log_format main '$remote_addr "$request"';
如果 $request 本身含引号,日志会“看起来错乱”。
✅ 解决:
escape=json(推荐)log_format json escape=json '{...}';
log_format 名称冲突log_format main '...';
log_format main '...'; # 重复定义
Nginx 会以第一个为准,后面不生效。
✅ 解决:
nginx -T | grep log_format
确认实际使用哪一个。
log_format main '...';
access_log /var/log/nginx/access.log;
默认用 combined,不是 main。
✅ 正确写法:
access_log /var/log/nginx/access.log main;
$remote_addr 全是 127.0.0.1请求经过:
client → nginx → upstream nginx
✅ 解决:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
日志使用:
$http_x_forwarded_for
✅ 推荐 JSON 格式:
log_format json escape=json '{
"time":"$time_local",
"ip":"$remote_addr",
"req":"$request",
"status":$status
}';
✅ 解决:
$time_local # 本地时间
$time_iso8601 # ISO 时间
确保服务器时区正确:
timedatectl
access_log /var/log/nginx/access.log main buffer=32k;
✅ 表现:
✅ 解决(调试时):
access_log /var/log/nginx/access.log main;
✅ 日志看着“乱”但其实是真实请求
可结合:
$request_length
$request_time
# 1. 检查配置
nginx -t
nginx -T | grep -E 'log_format|access_log'
# 2. 查看实际日志
tail -f /var/log/nginx/access.log
# 3. 确认变量是否存在
如果你愿意,可以:
我可以直接帮你指出“哪里异常、怎么改”。