在 CentOS 上 Java 日志出现乱码,通常不是 Java 本身的 bug,而是字符编码不一致导致的。下面按常见原因 + 解决方案给你梳理一下。
CentOS 默认可能是:
LANG=zh_CN.GBK
或
LANG=C
而 Java 默认会用系统编码(file.encoding)。
查看当前编码:
locale
echo $LANG
如果是 GBK / C,就很容易乱码。
✅ 解决:
# 修改为 UTF-8
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效:
vi /etc/locale.conf
LANG="zh_CN.UTF-8"
Java 会读取:
file.encoding
查看:
java -XshowSettings:properties -version 2>&1 | grep encoding
✅ 强制指定 UTF-8:
java -Dfile.encoding=UTF-8 -jar xxx.jar
推荐放启动脚本:
JAVA_OPTS="-Dfile.encoding=UTF-8"
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>app.log</file>
<encoder>
<charset>UTF-8</charset>
<pattern>%d %msg%n</pattern>
</encoder>
</appender>
<PatternLayout charset="UTF-8" pattern="%d %msg%n"/>
❌ 不写 charset,可能用系统编码
例如:
cat 或 vi 用 GBK 看✅ 确认文件编码:
file app.log
✅ 用 UTF-8 查看:
vi
:set encoding=utf-8
或
less app.log
即使服务器没问题,客户端也会乱码。
✅ 设置:
终端编码 = UTF-8
✅ 解决:
?useUnicode=true&characterEncoding=UTF-8
locale
echo $LANG
java -XshowSettings:properties -version | grep encoding
file app.log
CentOS + Java 日志乱码,99% 是:系统编码 ≠ JVM 编码 ≠ 日志框架编码 ≠ 终端编码
如果你愿意,可以把:
locale 输出发出来,我可以直接帮你定位是哪一层出的问题。