Tomcat日志乱码的本质是字符编码不一致(JVM输出编码、系统环境编码、终端显示编码、日志处理器编码未统一为UTF-8)。以下是针对性解决步骤,按优先级排序:
Tomcat的启动脚本(catalina.sh
)需显式指定JVM的字符编码为UTF-8,确保应用输出、日志写入的一致性。
$CATALINA_HOME/bin/catalina.sh
($CATALINA_HOME
为Tomcat安装目录);#!/bin/sh
之后)添加以下内容:export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
注:
-Dfile.encoding
控制JVM默认字符编码,-Dsun.jnu.encoding
控制文件系统操作的编码(如日志文件写入),两者均需设置为UTF-8。
Tomcat的日志处理器(如ConsoleHandler
)默认编码可能为ISO-8859-1,需修改logging.properties
文件强制使用UTF-8。
$CATALINA_HOME/conf/logging.properties
;UTF-8
:java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.FileHandler.encoding = UTF-8
注:若日志通过
log4j
或logback
输出,需修改对应配置文件(如log4j.properties
中的log4j.appender.CONSOLE.Encoding=utf-8
)。
CentOS系统的默认语言环境(LANG
)需设置为UTF-8,避免终端或系统工具(如cat
)显示乱码。
echo $LANG
若输出不是zh_CN.UTF-8
或en_US.UTF-8
,需修改系统配置:/etc/profile
文件,添加以下内容:export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
source /etc/profile
注:可通过
locale
命令验证所有环境变量是否为UTF-8。
若使用SSH工具(如PuTTY、Xshell)连接CentOS,需确保终端工具的字符编码设置为UTF-8:
Connection -> Data -> Terminal-type string
设置为xterm-256color
,Window -> Translation -> Remote character set
设置为UTF-8
;文件 -> 属性 -> 终端 -> 编码
设置为UTF-8
。若使用logrotate
或cronolog
切割日志,需确保切割命令不会破坏文件编码(如避免用>
重定向清空文件,推荐用truncate
):
cp $CATALINA_HOME/logs/catalina.out $CATALINA_HOME/logs/catalina.out.$(date +%Y-%m-%d)
truncate -s 0 $CATALINA_HOME/logs/catalina.out
若应用输出的日志本身包含乱码(如从数据库读取或文件读取时未指定编码),需修改应用代码:
OutputStreamWriter
):import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class LogWriter {
public static void main(String[] args) {
try (PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"))) {
out.println("中文测试");
} catch (Exception e) {
e.printStackTrace();
}
}
}
log4j
/logback
,确保appender
的encoding
设置为UTF-8
。完成以上步骤后,重启Tomcat服务使配置生效:
$CATALINA_HOME/bin/shutdown.sh && $CATALINA_HOME/bin/startup.sh
通过以上步骤,可彻底解决CentOS下Tomcat日志乱码问题。若仍存在乱码,建议检查日志内容的具体编码(用file -i catalina.out
命令),确认是否与配置一致。