昨天帮朋友看一台老服务器,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 65001Linux 下在 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,基本立竿见影。