温馨提示×

Tomcat日志中如何查看请求处理时间

小樊
59
2025-09-30 09:28:57
栏目: 智能运维

Tomcat日志中查看请求处理时间的方法

1. 配置AccessLogValve记录处理时间(核心方法)

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秒。

2. 使用日志分析工具提取处理时间

配置完成后,需通过工具分析日志中的处理时间字段(如%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秒的请求
    
  • 高级分析:使用ELK Stack(Elasticsearch+Logstash+Kibana)、Splunk等工具,将日志导入后通过可视化 dashboard 展示处理时间的分布(如平均值、P90、P99)、趋势图等,便于快速定位慢请求。

3. 应用层记录处理时间(补充方案)

若需更细粒度的控制(如记录特定请求的处理时间),可在应用中通过过滤器(Filter)或拦截器(Interceptor)记录开始和结束时间:

  • Servlet Filter示例
    @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)
        }
    }
    
    此方案可记录每个请求的详细处理时间,但需修改应用代码,适用于需要定制化日志的场景。

0