温馨提示×

centos java日志编码为何乱码

小樊
51
2026-10-14 21:20:29
栏目: 编程语言

在 CentOS 上 Java 日志出现乱码,通常不是 Java 本身的 bug,而是字符编码不一致导致的。下面按常见原因 + 对应解决办法系统说明。


一、最常见原因:系统 / 终端编码不是 UTF‑8

1. 查看当前编码

locale

如果看到:

LANG=
LC_ALL=

或

zh_CN.GBK

就很可能乱码。

2. 解决:设置为 UTF‑8

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 默认编码不是 UTF‑8(非常常见)

Java 默认编码依赖系统 locale,CentOS 默认可能不是 UTF‑8。

查看 Java 默认编码

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"

三、日志框架编码配置错误

1. Logback

<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss} %msg%n</pattern>
    <charset>UTF-8</charset>
</encoder>

2. Log4j2

<PatternLayout charset="UTF-8" pattern="%d %msg%n"/>

3. Log4j1

log4j.appender.file.encoding=UTF-8

四、日志文件本身编码不对

即使程序输出正确,如果:

  • 用 vi / cat 看是乱码
  • 用 Windows 记事本打开是乱码

可能是:

  • 文件本来是 GBK
  • 或终端显示编码不匹配

检查文件编码

file log.log

转换编码

iconv -f GBK -t UTF-8 log.log > log_utf8.log

五、SSH 客户端编码问题(很多人忽略)

如果你用:

  • Xshell
  • SecureCRT
  • PuTTY

终端编码不是 UTF‑8,也会“看起来乱码”。

✅ 解决方法:

  • Xshell:右键 → 属性 → 终端 → 编码 → UTF‑8
  • PuTTY:Window → Translation → UTF‑8

六、从 Windows 拷贝脚本 / 文件导致

Windows 默认 GBK,CentOS 默认 UTF‑8

解决

  • 用 dos2unix
  • 或统一用 UTF‑8 保存
dos2unix start.sh

七、快速自查清单 ✅

locale
java -XshowSettings:properties -version | grep encoding
file your.log

总结一句话

CentOS Java 日志乱码 = 系统编码 + JVM 编码 + 日志框架编码 + 终端编码 不一致

只要统一成 UTF‑8,99% 问题解决。

如果你愿意,可以贴:

  • 日志片段
  • locale 输出
  • 用的日志框架(Logback / Log4j)

我可以帮你精准定位是哪一层的问题。

0 踩