在 Ubuntu 上 Tomcat 日志出现乱码,通常是字符编码不一致导致的(Java 默认编码、系统语言环境、日志框架编码、终端编码不一致)。下面按最常见原因 → 解决方案给你一套完整排查办法。
先搞清楚是哪里乱码:
tail -f 看到乱码一般 Tomcat 日志乱码,90% 是
catalina.out或log4j/logback输出编码问题。
Tomcat 默认使用系统编码,Ubuntu 经常是 POSIX 或 ANSI_X3.4-1968,就会乱码。
bin/catalina.shsudo vi /opt/tomcat/bin/catalina.sh
在文件开头(约 # OS specific support 前)加:
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
或直接写死:
JAVA_OPTS="-Dfile.encoding=UTF-8"
重启 Tomcat:
sudo systemctl restart tomcat
查看当前编码:
locale
如果不是 UTF-8,执行:
sudo apt install locales
sudo dpkg-reconfigure locales
选择:
zh_CN.UTF-8
或
en_US.UTF-8
然后:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
如果你用的是 log4j 或 logback,必须显式指定编码。
log4j.appender.file.encoding=UTF-8
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<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>
如果你是 tail -f catalina.out 看到乱码:
locale
确保终端是 UTF-8(SecureCRT / Xshell / Terminal 都设为 UTF-8)
测试:
echo "中文测试"
如果这也乱码,就不是 Tomcat 的问题。
Tomcat 自带 logging.properties:
sudo vi /opt/tomcat/conf/logging.properties
确保:
java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.FileHandler.encoding = UTF-8
echo $LANG
echo $LC_ALL
java -XshowSettings:properties -version 2>&1 | grep encoding
理想结果:
LANG=zh_CN.UTF-8
file.encoding = UTF-8
Ubuntu + Tomcat 9 + UTF-8 中文日志:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
JAVA_OPTS="-Dfile.encoding=UTF-8"
如果你愿意,可以告诉我:
我可以直接帮你给一份可复制的配置。