要识别慢请求,首先需确保Tomcat的访问日志(Access Log)已启用并包含处理时间字段。通过server.xml配置文件中的<Valve>标签开启访问日志,关键参数为pattern(日志格式)。常用的处理时间字段为%D(请求处理时间,单位:毫秒)或%T(秒),示例如下:
<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记录处理时间 -->
resolveHosts="false"/>
若未配置%D,则无法直接从访问日志中获取请求处理时间,需先调整配置。
grep+awk筛选慢请求通过grep过滤包含处理时间的日志行,再用awk提取并比较处理时间(以%D字段为例,假设阈值为800毫秒):
grep 'D=' /var/log/tomcat/logs/localhost_access_log.*.txt | awk -F 'D=' '{if ($2 > 800) print $0}'
-F 'D='指定分隔符为D=,$2为处理时间(毫秒),> 800为慢请求阈值。sed按时间段提取慢请求若需分析特定时间段的慢请求(如2025-10-10 14:00-15:00),可结合sed截取日志片段后再筛选:
sed -n '/2025-10-10 14:00:00/,/2025-10-10 15:00:00/p' /var/log/tomcat/logs/catalina.out | grep 'D=' | awk -F 'D=' '{if ($2 > 800) print $0}'
sed按时间范围提取日志,后续步骤同上。通过Shell脚本自动化慢请求分析,避免重复操作。示例如下(保存为analyze_slow_requests.sh):
#!/bin/bash
# 配置日志路径和慢请求阈值(毫秒)
LOG_PATTERN="/var/log/tomcat/logs/localhost_access_log.*.txt"
SLOW_THRESHOLD=800
# 分析日志并输出慢请求详情
echo "===== 慢请求分析结果(阈值:${SLOW_THRESHOLD}ms) ====="
awk -F 'D=' -v threshold="$SLOW_THRESHOLD" '
{
if ($2 ~ /^[0-9]+$/) { # 确保处理时间为数字
if ($2 > threshold) {
print "IP:" $1 " | URL:" $6 " | 处理时间:" $2 "ms | 时间:" $4
}
}
}' $(ls -1 $LOG_PATTERN | sort -r) # 按文件名倒序(最新日志优先)
chmod +x analyze_slow_requests.sh
./analyze_slow_requests.sh
IP:192.168.1.100 | URL:/api/slow-endpoint | 处理时间:1200ms | 时间:[10/Oct/2025:14:30:22 +0800]
该脚本会输出慢请求的客户端IP、请求URL、处理时间、时间戳,便于快速定位问题接口。对于海量日志,手动分析效率低,可使用专业工具实现可视化分析:
%D字段),将数据导入Elasticsearch,再通过Kibana创建仪表盘,设置“处理时间>阈值”的筛选条件,直观展示慢请求的趋势、分布及详情。%D字段,设置警报规则(如处理时间>800ms时触发邮件/短信告警)。pattern中包含%D字段,否则无法获取处理时间;若使用其他格式(如combined),需调整解析逻辑。logrotate或cronolog工具定期分割日志文件,避免单个文件过大影响分析效率。