Tomcat的慢查询相关日志主要分布在以下路径(默认安装下):
/var/log/tomcat/localhost_access_log.*.txt(如localhost_access_log.2025-10-21.txt);/var/log/tomcat/catalina.out或/opt/tomcat/logs/catalina.out。通过Linux命令行工具可快速定位慢查询,核心逻辑是提取日志中的处理时间字段并与阈值(如800毫秒)比较:
QTime是Solr/Jetty中常见的查询耗时字段,若Tomcat应用集成这些组件,可通过此关键字定位)。grep 'QTime' /var/log/tomcat/localhost_access_log.*.txt(搜索所有访问日志中包含QTime的行)。cat /var/log/tomcat/localhost_access_log.*.txt | grep 'QTime' | awk -F 'QTime=' '{if ($2 > 800) print $0}'(以QTime=为分隔符,提取第二列(耗时)大于800毫秒的行)。sed -n '/2025-10-21 10:00/,/2025-10-21 12:00/p' /var/log/tomcat/catalina.out > slow_query_10_21.log(提取2025-10-21 10:00至12:00之间的日志,保存到新文件)。通过Shell脚本可实现批量、定时的慢查询分析,避免手动操作:
示例脚本(分析访问日志中响应时间超过阈值的请求):
#!/bin/bash
LOG_FILE="/var/log/tomcat/localhost_access_log.*.txt" # 访问日志路径
SLOW_QUERY_THRESHOLD=800 # 慢查询阈值(毫秒)
# 提取每行的IP和处理时间(假设格式为"%h %l %u %t \"%r\" %s %b %D",%D为处理时间,单位毫秒)
awk -v threshold=$SLOW_QUERY_THRESHOLD '{
# 匹配%D字段(处理时间),假设%D在行尾(如"2326")
if (match($0, /[0-9]+$/)) {
time = substr($0, RSTART, RLENGTH);
if (time > threshold) {
print "Slow Query IP:", $1, "| Time:", time, "ms | Request:", $6;
}
}
}' "$LOG_FILE" > slow_queries_report.txt
运行脚本后,slow_queries_report.txt将包含所有慢查询的IP、处理时间及请求路径。
对于大规模日志,手动分析效率低,可使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等工具:
pt-query-digest分析慢SQL(需配合MySQL慢查询日志)。pattern参数决定了日志中是否包含处理时间(如%D表示处理时间,单位毫秒)。若未开启,需修改server.xml中的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" /> <!-- 添加%D字段 -->
通过以上方法,可高效识别Tomcat日志中的慢查询,为后续优化(如SQL调优、代码重构、缓存引入)提供依据。