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中的慢查询根源,针对性优化应用性能。需注意,慢查询分析需结合业务场景(如高峰时段、特定接口),避免过度优化。