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
命令),確認是否與配置一致。