Tomcat日志中查看請求處理時間的方法
Tomcat通過AccessLogValve
組件記錄訪問日志,可通過修改其pattern
屬性添加處理時間字段。常見配置位置為conf/server.xml
(全局配置)或conf/context.xml
(應用級配置)。
<Valve>
標簽的pattern
屬性中添加以下占位符:
%D
:處理請求的時間,單位為毫秒(推薦,精度更高);%T
:處理請求的時間,單位為秒(適用于粗略統計);%{request_time}e
:部分版本中也可使用此格式(需確認Tomcat版本支持)。<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D %T"
resolveHosts="false"/>
上述配置會生成類似如下的日志條目:192.168.1.100 - - [10/Oct/2025:14:30:00 +0800] "GET /api/test HTTP/1.1" 200 1024 156 0.156
156
(%D)表示處理時間為156毫秒,0.156
(%T)表示處理時間為0.156秒。配置完成后,需通過工具分析日志中的處理時間字段(如%D
或%T
對應的數值):
tail -f
命令實時監控訪問日志,例如:tail -f ${TOMCAT_HOME}/logs/localhost_access_log.2025-10-10.txt
awk
命令提取%D
(第9列,以空格分隔)或%T
(第10列)字段,例如:awk '{print $9}' localhost_access_log.2025-10-10.txt | sort -n | uniq -c # 統計各處理時間的請求數
awk '$9 > 1000' localhost_access_log.2025-10-10.txt # 篩選處理時間超過1秒的請求
若需更細粒度的控制(如記錄特定請求的處理時間),可在應用中通過過濾器(Filter)或攔截器(Interceptor)記錄開始和結束時間:
@WebFilter("/*")
public class RequestTimeFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
long startTime = System.currentTimeMillis();
chain.doFilter(request, response); // 執行后續請求處理
long endTime = System.currentTimeMillis();
long processingTime = endTime - startTime;
System.out.printf("Request URL: %s, Processing Time: %d ms%n",
httpRequest.getRequestURL(), processingTime);
// 可將日志輸出到應用日志文件(如Log4j、SLF4J)
}
}
此方案可記錄每個請求的詳細處理時間,但需修改應用代碼,適用于需要定制化日志的場景。