在 Ubuntu + Apache Tomcat 上开启“慢日志”,通常是指 记录处理时间过长的请求。Tomcat 本身没有像 Nginx 那样的 slowlog,但可以通过 AccessLogValve + 条件判断 或 日志分析 来实现。下面给你几种常用且可落地的方法。
Tomcat 的 AccessLogValve 支持在 access log 中记录请求耗时,然后你可以通过 过滤时间阈值 得到“慢请求日志”。
编辑:
sudo vim /opt/tomcat/conf/server.xml
(路径可能是 /etc/tomcat9/server.xml 或 /usr/local/tomcat/conf/server.xml)
在 <Host> 中添加或修改:
<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 |
请求耗时(毫秒) ✅ |
%T |
秒(浮点) |
%r |
请求 URL |
%s |
HTTP 状态码 |
%b |
响应字节数 |
示例日志:
127.0.0.1 - - [10/Oct/2024:11:22:33 +0800] "GET /api/test HTTP/1.1" 200 1234 2150
表示请求耗时 2150ms
awk '$NF > 2000' /opt/tomcat/logs/localhost_access_log.*.txt
或实时查看:
tail -f /opt/tomcat/logs/localhost_access_log.*.txt | awk '$NF > 2000'
✅ 这是最简单、最稳定、生产可用方案
不推荐生产环境,性能影响大
<Valve className="org.apache.catalina.valves.RequestDumperValve" />
日志会输出到 catalina.out,不适合只分析慢请求。
如果你前面有 Nginx:
http {
log_format main '$remote_addr - $request_time - $request';
access_log /var/log/nginx/access.log main;
}
筛选:
awk '$3 > 2' /var/log/nginx/access.log
long start = System.currentTimeMillis();
// 处理请求
long cost = System.currentTimeMillis() - start;
if (cost > 2000) {
log.warn("slow request: {} ms", cost);
}
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long cost = System.currentTimeMillis() - start;
if (cost > 2000) {
log.warn("slow request cost {} ms", cost);
}
| 场景 | 推荐方案 |
|---|---|
| 只想看慢请求 | AccessLogValve + %D |
| 前端有 Nginx | Nginx request_time |
| 需要定位业务慢点 | 应用 Filter / AOP |
| 生产环境 | AccessLogValve ✅ |
<Host name="localhost" appBase="webapps">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D" />
</Host>
查看慢请求:
awk '$NF > 1000' /var/lib/tomcat9/logs/access_log.*.txt
如果你愿意,可以告诉我:
我可以给你 完全贴合你环境的配置。