电脑港
白蓝主题五 · 清爽阅读
首页  > 软件应用

日志系统中文显示乱码?几招搞定常见编码坑

昨天帮朋友看一台老服务器,Java 应用跑得好好的,但一打开日志文件——满屏问号、方块、还有类似 的符号。他急得直拍键盘:‘明明代码里写了中文提示,怎么全变乱码了?’

问题出在哪?

不是日志没写进去,而是读取或显示时“认错了字”。核心就俩字:编码不一致。比如程序用 UTF-8 写入,而你用 GBK 打开,或者终端、IDE、日志查看工具默认用了错的字符集,中文立马变‘密码’。

常见场景和解法

场景1:Linux 终端直接 tail 日志,中文乱码
先查当前终端编码:

locale | grep charset
如果输出是 LC_CTYPE="C"en_US.UTF-8 但日志是 GB2312 写的,就会出问题。临时修复:
export LC_ALL=zh_CN.UTF-8
(前提是系统已安装该 locale,可用 locale -a | grep zh_CN 查)

场景2:Tomcat / Spring Boot 控制台中文乱码
Windows 下启动脚本(startup.bat)里加一句:

chcp 65001
Linux 下在 catalina.sh 开头加:
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"

场景3:Log4j2 日志文件中文乱码
检查 log4j2.xml 配置,确保 PatternLayout 指定了编码:

<PatternLayout charset="UTF-8"><pattern>%d %p %c{1.} [%t] %m%n</pattern></PatternLayout>

小技巧:快速验证日志是否真乱码

别光靠眼睛看。用命令行试试:

file -i your-app.log
看输出里的 charset= 是什么;再用:
iconv -f GBK -t UTF-8 your-app.log | head -n 5
如果能正常显示中文,说明确实是编码转换问题,不是程序漏写了中文。

顺手记一嘴:Windows 记事本打开日志乱码,别急着骂记事本——它默认用 ANSI(也就是本地编码),试试用 VS Code 或 Notepad++ 打开,右下角点编码选 UTF-8 或 GBK,基本立竿见影。