Nginx 日志出现乱码 / 编码异常,通常是因为客户端请求、Nginx 配置、系统 locale、或日志分析工具之间的字符编码不一致。下面按常见场景给你一套排查与解决方案。
区分以下几种情况:
$request 里通常是 URL 编码(%E4%B8%AD)%E4%B8%AD,这不是乱码,是正常的✅ 如果你想看到“中文”而不是 %E4%B8%AD:
log_format main '$remote_addr - $host - $request_uri_unescaped';
$request_uri_unescaped可显示解码后的 URI(较新版本支持)
charset utf-8;
这个主要影响 HTTP 响应头,对日志乱码帮助有限,但建议加上。
locale
如果不是 UTF-8(如 C 或 POSIX),日志工具可能误判编码。
sudo localectl set-locale LANG=en_US.UTF-8
或
export LANG=en_US.UTF-8
重启 Nginx:
systemctl restart nginx
file -i access.log
正常应为:
access.log: text/plain; charset=utf-8
转换:
iconv -f gbk -t utf-8 access.log > access_utf8.log
推荐一个干净、UTF-8 友好的日志格式:
log_format utf8_log '$time_local | $remote_addr | $host | '
'$request_method $request_uri_unescaped $server_protocol | '
'$status $body_bytes_sent | '
'$http_referer | $http_user_agent';
Nginx 默认 不记录 POST body。
如果你用了:
lua_need_request_body on;
或 proxy_pass + log_subrequest
那要注意:
✅ 建议:
nginx-lua 做 UTF-8 校验后再写如果是分析平台乱码:
utf-8encoding: utf-8
locale 是 UTF-8$request_uri_unescaped 看中文如果你愿意,可以把具体的乱码样例 + Nginx 版本 + 系统发我,我可以直接帮你定位是哪一层出的问题。