Tomcat本身不直接生成SQL慢查询日志(需依赖连接的数据库如MySQL的慢查询日志),但可通过访问日志识别处理缓慢的HTTP请求,结合数据库慢查询日志定位具体问题。
server.xml的<Host>标签内添加AccessLogValve,启用访问日志并定义格式(关键字段%D表示请求处理时间,单位为毫秒):<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D"
resolveHosts="false"/>
示例日志条目:192.168.1.1 - - [17/Sep/2025:10:00:00 +0800] "GET /api/slow-endpoint HTTP/1.1" 200 1234 1500(其中1500表示处理耗时1.5秒)。grep 'localhost_access_log' /var/log/tomcat/catalina.out | awk -F ' ' '{print $NF}' | awk '$1 > 800 {print $0}'
grep 'localhost_access_log' /var/log/tomcat/catalina.out | wc -l # 总请求数
grep 'localhost_access_log' /var/log/tomcat/catalina.out | awk -F ' ' '{print $NF}' | awk '$1 > 800 {count++} END {print count}' # 慢查询数
若慢查询源于数据库操作,需启用数据库(如MySQL)的慢查询日志,并与Tomcat访问日志关联:
my.cnf或my.ini):slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 慢查询阈值(秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
重启MySQL生效:systemctl restart mysqld。pt-query-digest(Percona Toolkit)分析慢查询日志,生成报告:pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt
报告会显示最耗时的查询、执行频率、索引使用情况等。EXPLAIN分析具体查询的执行计划:EXPLAIN SELECT * FROM users WHERE status = 'inactive' AND created_at < '2025-01-01';
关注type列(需达到ref或range级别)、key列(是否使用索引)、rows列(扫描行数)。grep/awk/sed:快速筛选和提取日志中的慢查询信息(适合简单分析)。tail -f:实时查看日志新增内容,监控实时慢查询(如tail -f /var/log/tomcat/catalina.out | grep 'QTime')。-Xms512m -Xmx1024m)、选择G1垃圾回收器(-XX:+UseG1GC),减少GC停顿。server.xml的Connector中配置压缩,减少传输时间:<Connector port="8080" protocol="HTTP/1.1"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,application/json" />
maxThreads(默认200),应对高并发请求(需根据服务器资源调整)。CREATE INDEX idx_status_created ON users(status, created_at))。SELECT *(只查询必要列)、减少子查询(用JOIN替代)、使用LIMIT限制结果集。INT代替VARCHAR存储数字)、避免过度索引(影响写入性能)。通过以上步骤,可系统识别Tomcat中的慢查询根源,针对性优化应用性能。需注意,慢查询分析需结合业务场景(如高峰时段、特定接口),避免过度优化。