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命令),确认是否与配置一致。