在 CentOS 上 Java 日志出现乱码,通常不是 Java 本身的 bug,而是字符编码不一致导致的。下面按常见原因 + 对应解决办法系统说明。
locale
如果看到:
LANG=
LC_ALL=
或
zh_CN.GBK
就很可能乱码。
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效(CentOS 7/8):
localectl set-locale LANG=zh_CN.UTF-8
或编辑:
vi /etc/locale.conf
LANG=zh_CN.UTF-8
Java 默认编码依赖系统 locale,CentOS 默认可能不是 UTF‑8。
java -XshowSettings:properties -version 2>&1 | grep encoding
启动 Java 时强制指定:
java -Dfile.encoding=UTF-8 -jar app.jar
如果是 Tomcat:
export JAVA_OPTS="-Dfile.encoding=UTF-8"
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<PatternLayout charset="UTF-8" pattern="%d %msg%n"/>
log4j.appender.file.encoding=UTF-8
即使程序输出正确,如果:
vi / cat 看是乱码可能是:
file log.log
iconv -f GBK -t UTF-8 log.log > log_utf8.log
如果你用:
终端编码不是 UTF‑8,也会“看起来乱码”。
✅ 解决方法:
Windows 默认 GBK,CentOS 默认 UTF‑8
dos2unixdos2unix start.sh
locale
java -XshowSettings:properties -version | grep encoding
file your.log
CentOS Java 日志乱码 = 系统编码 + JVM 编码 + 日志框架编码 + 终端编码 不一致
只要统一成 UTF‑8,99% 问题解决。
如果你愿意,可以贴:
locale 输出我可以帮你精准定位是哪一层的问题。