Tomcat的日志主要分為運行日志(記錄應用運行狀態、錯誤信息)和訪問日志(記錄HTTP請求詳情)。默認情況下,運行日志由logging.properties
配置,訪問日志由server.xml
配置,均存儲在${CATALINA_HOME}/logs
目錄下(CATALINA_HOME
為Tomcat安裝目錄)。
進入Tomcat的logs
目錄,常見日志文件說明:
server.xml
開啟)。使用tail -f
命令跟蹤catalina.out
的最新內容:
cd $CATALINA_HOME/logs
tail -f catalina.out
按Ctrl+C
停止跟蹤。
使用sed
命令截取指定時間范圍的日志(例如2025-09-01至2025-09-02):
sed -n "/2025-09-01/,/2025-09-02/p" catalina.out > /tmp/tomcat_specific_logs.txt
將結果保存到/tmp/tomcat_specific_logs.txt
中。
若Tomcat以Systemd服務運行(默認方式),可通過以下命令查看服務日志:
journalctl -u tomcat -f
-f
參數表示實時跟蹤,-u tomcat
指定服務名稱(需與systemctl start tomcat
中的服務名一致)。
Tomcat默認的日志輪轉配置文件位于/etc/logrotate.d/tomcat
,編輯該文件調整規則(示例):
/var/log/tomcat/catalina.out {
daily # 每天輪轉
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(生成.gz文件)
missingok # 若日志文件不存在也不報錯
notifempty # 若日志為空則不輪轉
create 0640 tomcat tomcat # 創建新日志文件,權限0640,屬主屬組為tomcat
postrotate
/bin/kill -HUP `cat /var/run/tomcat.pid` 2>/dev/null || true # 通知Tomcat重新打開日志文件
endscript
}
修改配置后,可通過以下命令立即執行輪轉:
logrotate -f /etc/logrotate.d/tomcat
若需更靈活的控制(如按大小輪轉),可編寫腳本tomcatLog.sh
:
#!/bin/bash
DIR="/opt/tomcat/logs"
LOGS="$DIR/catalina.out"
DATE=$(date +%Y-%m-%d)
BACKUP_FILE="$DIR/catalina.$DATE.bak"
ARCHIVE_FILE="$DIR/catalina.$DATE.tar.gz"
if [ -d "$DIR" ]; then
cd "$DIR"
cp "$LOGS" "$BACKUP_FILE" # 備份原日志
tar -czf "$ARCHIVE_FILE" "$BACKUP_FILE" # 壓縮備份
rm -f "$BACKUP_FILE" # 刪除備份文件
> "$LOGS" # 清空原日志
else
echo "Directory does not exist: $DIR"
fi
賦予執行權限并添加定時任務(每天凌晨2點執行):
chmod +x $DIR/tomcatLog.sh
crontab -e
# 添加以下行
0 2 * * * $DIR/tomcatLog.sh
Tomcat使用java.util.logging
框架,日志級別從低到高為:SEVERE
> WARNING
> INFO
> CONFIG
> FINE
> FINER
> FINEST
。級別越高,日志越詳細。
編輯${CATALINA_HOME}/conf/logging.properties
,調整以下配置:
# 全局日志級別(默認INFO)
.level=INFO
# 控制臺日志級別(默認INFO)
java.util.logging.ConsoleHandler.level=INFO
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
# 文件日志級別(默認INFO)
java.util.logging.FileHandler.level=INFO
java.util.logging.FileHandler.pattern=%h/tomcat/logs/app.%u.%g.log
java.util.logging.FileHandler.limit=50000 # 單個日志文件最大50MB
java.util.logging.FileHandler.count=10 # 保留10個備份文件
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
# 特定組件的日志級別(如localhost)
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level=INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers=2localhost.org.apache.juli.AsyncFileHandler
修改完成后,重啟Tomcat使配置生效:
systemctl restart tomcat
訪問日志默認未開啟,需通過server.xml
配置。編輯${CATALINA_HOME}/conf/server.xml
,找到<Host>
標簽,添加或修改AccessLogValve
配置:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D"
resolveHosts="false"/>
CATALINA_HOME
);localhost_access_log
);.txt
);%h
:客戶端IP地址;%t
:請求時間;%r
:請求行(如GET /index.html HTTP/1.1
);%s
:響應狀態碼(如200、404);%b
:響應大?。ㄗ止潱?;%D
:請求處理時間(毫秒);false
表示不解析,提升性能)。若需要更強大的日志功能(如異步日志、日志分級存儲),可集成Log4j或Logback。
下載Log4j2 JAR包(log4j-api-2.x.x.jar
、log4j-core-2.x.x.jar
、log4j-jul-2.x.x.jar
),放入${CATALINA_HOME}/lib
目錄。
刪除${CATALINA_HOME}/bin/tomcat-juli.jar
和${CATALINA_HOME}/lib/tomcat-juli-adapters.jar
(避免與Log4j沖突)。
在${CATALINA_HOME}/lib
目錄下創建log4j2.xml
,示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
<RollingFile name="File" fileName="${catalina.base}/logs/app.log"
filePattern="${catalina.base}/logs/app-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy max="7"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
systemctl restart tomcat
tomcat
)對日志目錄有讀寫權限;FINEST
級別)可能影響Tomcat性能,生產環境建議使用INFO
或WARNING
級別。