在 CentOS 上设置 Java 日志编码,通常可以从JVM 参数、日志框架配置、系统环境、文件/终端编码几个层面来处理。下面按常见场景说明。
Java 日志最终是“字符 → 字节”写文件的,JVM 默认编码很关键。
java -Dfile.encoding=UTF-8 \
-Dsun.jnu.encoding=UTF-8 \
-jar your-app.jar
或在 JAVA_OPTS 中:
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
✅ 影响:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
⚠️ 不设置 charset,Logback 会用 JVM 默认编码
log4j.appender.file.encoding=UTF-8
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="%d %p %c - %m%n"/>
</Console>
即使 Java 设置正确,系统编码不对也会乱码。
locale
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
永久生效:
vim /etc/locale.conf
LANG=en_US.UTF-8
JAVA_OPTS="-Dfile.encoding=UTF-8"
conf/logging.properties
java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.FileHandler.encoding = UTF-8
| 检查项 | 命令/位置 |
|---|---|
| JVM 编码 | java -Dfile.encoding=UTF-8 |
| 系统编码 | locale |
| 日志框架 | logback/log4j 配置 |
| 文件编码 | file app.log |
| 终端 | echo $LANG |
Java 日志乱码 = JVM 编码 ≠ 日志文件编码 ≠ 系统终端编码
如果你能告诉我:
我可以直接给你一份可复制的配置。