Tomcat日志中慢查询怎么定位
小樊
39
2025-11-30 16:18:51
定位思路与准备
- 明确“慢”的定义:设定阈值(如800 ms或2 s),用于后续筛选。
- 找到日志文件:Tomcat常见日志目录为**/var/log/tomcat/或/opt/tomcat/logs/;访问日志通常为localhost_access_log.YYYY-MM-DD.txt**,运行日志为catalina.out。
- 确认日志格式:若访问日志包含QTime(请求处理耗时,单位毫秒),可直接按QTime筛选;否则需先调整访问日志的pattern以输出耗时字段。
快速命令行定位
- 基本筛选:从访问日志中找出包含QTime的行
- grep ‘QTime’ /var/log/tomcat/localhost_access_log.*.txt
- 阈值筛选:以800 ms为例,提取QTime大于阈值的请求
- 写法A(兼容性好):cat /var/log/tomcat/localhost_access_log.*.txt | grep ‘QTime’ | awk -F’QTime=’ ‘{if($2+0>800) print}’
- 写法B(字段分隔更稳健):cat /var/log/tomcat/localhost_access_log.*.txt | awk -F’QTime=’ ‘$2+0>800 {print}’
- 时间范围提取:将某段时间日志导出到单独文件(示例为10:00–11:00)
- sed -n ‘/2025-03-12 10:00/,/2025-03-12 11:00/p’ /var/log/tomcat/catalina.out > today.log
- 实时监控:观察新增慢请求
- tail -f /var/log/tomcat/localhost_access_log.*.txt | awk -F’QTime=’ ‘$2+0>800 {print "[慢] " $0}’
- 说明:QTime后的数值是毫秒;上述命令中的**$2+0**用于把字符串转为数值进行比较。
进阶分析与可视化
- 集中化分析:将Tomcat日志采集到ELK Stack(Elasticsearch + Logstash + Kibana)或Graylog,用Kibana/Graylog建立QTime分布直方图、Top慢接口、按IP/UA/接口聚合等可视化面板,便于长期观测与告警。
- 数据库侧慢SQL:若瓶颈在数据库,开启数据库慢查询日志(如MySQL设置slow_query_log=ON、long_query_time=2),再用pt-query-digest分析,定位执行计划与索引问题。注意:pt-query-digest分析的是数据库慢日志,并非Tomcat访问日志。
- 关联排查:结合catalina.out错误日志、线程转储(jstack)、JVM监控(JConsole/VisualVM/Prometheus+Grafana)与数据库连接池指标,判断是应用、容器还是数据库导致的慢。
访问日志配置建议
- 在server.xml的AccessLogValve中输出耗时字段(示例含QTime与Usec):
- <Valve className=“org.apache.catalina.valves.AccessLogValve”
directory=“logs” prefix=“localhost_access_log” suffix=“.txt”
pattern=“%h %l %u %t “%r” %s %b %D %F QTime=%D Usec=%{us}T” />
- 字段含义要点:
- %D:请求处理时间,单位毫秒(适合做QTime阈值筛选)。
- %F:响应提交时间,单位毫秒(从请求开始到响应提交)。
- %T:请求处理时间,单位秒(浮点)。
- %{us}T:请求处理时间,单位微秒(便于更细粒度分析)。
- 修改配置后重启Tomcat,新的访问日志将包含耗时字段,便于后续命令与可视化直接筛选。