在CentOS系统中,Tomcat的日志文件通常位于/var/log/tomcat/(默认安装路径)或/opt/tomcat/logs/(自定义安装路径)目录下,主要包括以下几类:
localhost_access_log.*.txt(如localhost_access_log.2025-10-21.txt)。catalina.out(滚动日志可能为catalina.2025-10-21.log)。application.log),需根据实际路径查找。慢查询的核心特征是请求处理时间长,需通过日志中的时间字段筛选。以下是常用命令和工具:
grep+awk筛选慢查询若访问日志中包含处理时间字段(如%D,单位为毫秒),可通过以下命令筛选出处理时间超过阈值的请求(例如阈值设为800毫秒):
# 筛选包含处理时间的行(假设pattern为%D)
grep '%D' /var/log/tomcat/localhost_access_log.2025-10-21.txt | awk -F ' ' '{if ($NF > 800) print $0}'
# 若日志中无%D字段,可通过请求开始和结束时间计算(需日志包含%t和%T字段)
grep 'GET /slow-endpoint' /var/log/tomcat/localhost_access_log.2025-10-21.txt | awk -F ' ' '{start=mktime(substr($4,2,10)" "substr($4,13,8)); end=start+($NF/1000); if(end-start>10) print $0}' # 阈值10秒
其中,$NF表示最后一列(处理时间),mktime用于将时间字符串转换为时间戳(需日志包含完整时间格式)。
sed按时间段提取慢查询若需分析特定时间段的慢查询(例如2025-10-21 14:00至15:00),可使用sed提取该时间段日志后再筛选:
# 提取指定时间段日志
sed -n '/2025-10-21 14:00/,/2025-10-21 15:00/p' /var/log/tomcat/localhost_access_log.2025-10-21.txt > /tmp/slow_query_period.log
# 筛选慢查询(结合grep)
grep '%D' /tmp/slow_query_period.log | awk -F ' ' '{if ($NF > 800) print $0}'
对于海量日志,手动分析效率低,可使用ELK Stack(Elasticsearch+Logstash+Kibana)进行可视化分析:
tomcat.conf文件,解析Tomcat访问日志(提取%D字段),并将数据导入Elasticsearch。pt-query-digest)若应用使用MySQL数据库,可通过pt-query-digest工具分析慢查询日志(需开启MySQL慢查询日志,且Tomcat应用连接MySQL):
# 登录MySQL,开启慢查询日志(阈值设为1秒)
mysql -u root -p -e "SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';"
# 使用pt-query-digest分析慢查询日志
pt-query-digest /var/log/mysql/mysql-slow.log > /tmp/slow_query_report.txt
报告中会列出慢查询的SQL语句、执行时间、调用频率等信息,帮助定位数据库瓶颈。
识别慢查询后,需从代码、数据库、Tomcat配置三个层面优化:
JdbcTemplate.batchUpdate)。@Async)。ALTER TABLE users ADD INDEX idx_name (name))。SELECT *,使用LIMIT限制结果集,优化JOIN语句(确保关联字段有索引)。EXPLAIN命令查看SQL执行计划,关注type列(需达到ref或range级别)。server.xml中配置Executor,增加最大线程数(如maxThreads="200"),减少线程等待时间。Connector配置,使用NIO协议提高I/O性能(如protocol="org.apache.coyote.http11.Http11NioProtocol")。compression="on",compressableMimeType="text/html,text/xml,application/json"),减少传输时间。cronolog工具按日期分割Tomcat日志(如/var/log/tomcat/localhost_access_log.%Y-%m-%d.txt),避免日志文件过大。tail -f命令实时查看慢查询日志(如tail -f /var/log/tomcat/localhost_access_log.2025-10-21.txt | grep '%D' | awk -F ' ' '{if ($NF > 800) print $0}'),及时发现异常。通过以上步骤,可系统排查CentOS上Tomcat的慢查询问题,逐步定位并解决性能瓶颈。