1. 定位Tomcat日志文件
Tomcat的日志文件集中存儲在<TOMCAT_HOME>/logs目錄(Linux/Windows均適用),核心日志文件及作用如下:
2. 快速篩選關鍵錯誤信息
使用命令行工具快速定位日志中的異常內容:
tail -f /path/to/tomcat/logs/catalina.out(Linux)或type logs\catalina.out(Windows),實時監控新增日志;grep -i "ERROR" /path/to/tomcat/logs/catalina.out(Linux)或findstr /i "ERROR" logs\catalina.out(Windows),提取包含“ERROR”“SEVERE”“Exception”的日志條目;sed -n '/2025-10-15 14:00:00/,/2025-10-15 14:10:00/p' catalina.out(Linux)或findstr /r "2025-10-15 14:[0-9][0-9]:[0-9][0-9]" catalina.out(Windows),提取特定時間段的日志。3. 分析錯誤堆棧跟蹤
當日志中出現異常(如java.lang.NullPointerException、java.sql.SQLException)時,重點查看堆棧跟蹤(Stack Trace)——它展示了異常從發生到傳播的完整調用鏈。例如:
SEVERE: Servlet.service() for servlet [jsp] in context with path [/myapp] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at com.example.MyServlet.doGet(MyServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
...
通過堆棧跟蹤可快速定位問題代碼位置(如MyServlet.java第25行),結合業務邏輯分析異常原因(如未初始化的對象、空指針引用)。
4. 關聯訪問日志與業務場景
訪問日志(localhost_access_log.<日期>.txt)記錄了每個HTTP請求的詳細信息,通過分析可定位請求層面的問題:
404(請求資源不存在)、500(服務器內部錯誤)、503(服務不可用),統計出現次數及對應URL;%D(響應時間,單位毫秒)字段,定位響應時間過長的請求(如超過2秒的GET /api/data請求);/checkout接口頻繁出現500錯誤,需結合應用日志(如localhost.<日期>.log)查看該接口的異常詳情(如數據庫連接失敗、支付接口超時)。5. 排查內存與線程問題
java.lang.OutOfMemoryError: Java heap space(堆內存溢出)、java.lang.OutOfMemoryError: Metaspace(元空間溢出),需:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof;jmap工具手動生成堆轉儲:jmap -dump:format=b,file=/path/to/dump.hprof <Tomcat_PID>;jstack <Tomcat_PID> > thread_dump.txt生成線程轉儲,分析:BLOCKED狀態的線程,分析阻塞原因(如同步塊過長、數據庫鎖競爭)。6. 調整日志級別細化排查
若默認日志級別(INFO)無法滿足需求,可通過修改conf/logging.properties文件調整日志級別(如DEBUG),獲取更詳細的日志信息:
# 將特定包的日志級別調整為DEBUG(如Spring框架)
org.springframework.level = DEBUG
# 將Tomcat容器的日志級別調整為DEBUG
org.apache.catalina.level = DEBUG
調整后重啟Tomcat,獲取更詳細的日志(如Spring Bean初始化過程、Tomcat請求處理細節),幫助定位深層問題。
7. 使用日志分析工具提升效率
對于大型應用或海量日志,手動分析效率低下,可使用以下工具:
grep過濾錯誤、awk統計錯誤次數、sort排序,例如:grep "ERROR" catalina.out | awk '{print $6}' | sort | uniq -c | sort -nr(統計每種錯誤類型的出現次數)。