CentOS 上 Java 日志出现乱码,通常不是 Java 本身的问题,而是字符编码不一致导致的。下面按最常见原因 → 排查方法 → 解决方案给你一个完整说明。
一、最常见原因(90% 都在这里)
1️⃣ Linux 系统字符集不是 UTF-8
Java 默认使用系统字符集,如果系统不是 UTF-8,日志就会乱码。
检查:
locale
如果看到类似:
LANG=zh_CN.GBK
LC_ALL=
或者没有 UTF-8,就说明有问题。
✅ 正确应该是:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
2️⃣ Tomcat / Java 启动参数没指定 UTF-8
即使系统是 UTF-8,Java 也可能用错误编码。
检查 Java 默认编码:
java -XshowSettings:properties -version 2>&1 | grep file.encoding
如果看到:
file.encoding=GBK
就会乱码。
3️⃣ 日志框架配置问题(logback / log4j)
日志文件本身编码不对。
例如 logback.xml:
<encoder>
<pattern>%d %p %c - %m%n</pattern>
</encoder>
✅ 正确写法:
<encoder>
<pattern>%d %p %c - %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
4️⃣ 终端 / SSH 工具编码不一致
如果你是在:
- Xshell
- SecureCRT
- PuTTY
查看日志,而终端编码不是 UTF-8,也会显示乱码(但文件本身是对的)。
✅ 终端编码要设置为 UTF-8
5️⃣ 日志文件本身已经是 GBK
如果日志是用 GBK 写的,你用 UTF-8 方式查看,也会乱码。
检查文件编码:
file xxx.log
二、一步步排查(推荐顺序)
✅ Step 1:确认系统字符集
locale
如果不是 UTF-8:
sudo localectl set-locale LANG=zh_CN.UTF-8
或:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
✅ Step 2:确认 Java 编码
java -XshowSettings:properties -version
如果不是 UTF-8,在启动参数中加:
-Dfile.encoding=UTF-8
例如:
java -Dfile.encoding=UTF-8 -jar app.jar
✅ Step 3:检查日志框架配置
- logback:加
UTF-8 - log4j2:
<PatternLayout charset="UTF-8" pattern="%d %p %c - %m%n"/>
✅ Step 4:确认终端编码
- Xshell:会话属性 → 终端 → 编码 → UTF-8
- Linux 终端:
echo $LANG
三、CentOS 7/8 常见完整解决方案(推荐)
在 /etc/profile 或 ~/.bashrc 中加入:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
然后:
source /etc/profile
Java 启动参数:
-Dfile.encoding=UTF-8
四、快速判断乱码来源
| 现象 | 原因 |
|---|---|
| 文件内容乱码 | 日志编码不对 |
| 终端显示乱码 | 终端编码不对 |
| 文件 & 终端都乱 | Java / 系统编码不对 |
| 只中文乱码 | 非 UTF-8 |
五、如果你愿意,我可以帮你精准定位
你可以直接贴出:
locale输出java -version- 日志框架(logback / log4j)
- 乱码截图或日志片段
我可以直接告诉你该改哪一行。
