Java 应用在 CentOS 上日志出现乱码,通常不是 Java 本身的 bug,而是字符编码不一致导致的。下面按最常见原因 → 排查 → 解决方案给你一个完整说明。
CentOS 默认可能是:
LANG=en_US
或
LANG=C
而不是 UTF-8,导致 Java 输出中文乱码。
✅ 正确应为:
LANG=zh_CN.UTF-8
# 或
LANG=en_US.UTF-8
Java 默认编码依赖系统环境,如果系统不是 UTF-8,Java 就会使用错误编码。
vim / less / tail 用错误编码打开locale
重点看:
LANG=
LC_ALL=
✅ 推荐结果:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是,继续看下面。
java -XshowSettings:properties -version
看:
file.encoding = UTF-8
❌ 如果是:
file.encoding = ANSI_X3.4-1968
或
US-ASCII
说明编码有问题。
file xxx.log
如果看到:
ISO-8859 text
说明日志不是 UTF-8。
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
编辑:
vim /etc/profile
追加:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
生效:
source /etc/profile
⚠️ 如果是 systemd 启动的服务,这个不一定生效,看方案二。
启动 Java 时加:
-Dfile.encoding=UTF-8
✅ 示例:
java -Dfile.encoding=UTF-8 -jar app.jar
✅ systemd 示例:
[Service]
Environment="JAVA_OPTS=-Dfile.encoding=UTF-8"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/app.jar
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<PatternLayout charset="UTF-8" pattern="%d %p %c - %m%n"/>
如果你是在 Xshell / MobaXterm 看日志:
| 误区 | 说明 |
|---|---|
| 改了系统 LANG 就万事大吉 | systemd 启动的服务可能不生效 |
| 日志文件是 UTF-8 就一定正常 | 打开方式不对也会乱码 |
| 只改 Java 程序 | 系统环境同样重要 |
locale
java -XshowSettings:properties -version
file app.log
cat app.log
你可以直接贴出:
locale 输出我可以 直接告诉你该改哪一行 ✅