在 Debian 上运行的 Tomcat 中追踪请求,通常可以从 访问日志、应用日志、线程与请求参数、以及调试级别日志 几个方面入手。下面按“最常用 → 进阶 → 排查技巧”的顺序说明。
Tomcat 默认不会自动开启访问日志,但生产中一般会配置。
编辑配置文件(常见路径):
/etc/tomcat9/server.xml
# 或
/opt/tomcat/conf/server.xml
查找:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="combined" />
/var/log/tomcat9/localhost_access_log.*.txt
建议改成包含 请求时间 + 响应时间 + 线程名:
pattern="%h %l %u %t "%r" %s %b %D %I"
含义:
%t:时间%r:请求方法和 URL%s:状态码%b:响应大小%D:耗时(毫秒)%I:线程名(非常关键,用于后续追踪)日志示例:
127.0.0.1 - - [10/Oct/2024:14:32:10 +0800] "GET /api/test HTTP/1.1" 200 123 45 http-nio-8080-exec-3
✅ 第一步:通过 AccessLog 找到请求线程名
例如:
http-nio-8080-exec-3
grep "http-nio-8080-exec-3" /var/log/tomcat9/catalina.out
你将看到该请求在 应用代码、过滤器、拦截器、异常栈 中的完整执行路径。
public class TraceFilter implements Filter {
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) {
String traceId = UUID.randomUUID().toString();
MDC.put("traceId", traceId);
try {
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
}
Logback 示例:
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger - %msg%n</pattern>
日志效果:
2024-10-10 14:33:01 [http-nio-8080-exec-3] [a1b2c3d4] INFO com.xxx.Api - request start
✅ 这是企业级最推荐方式
编辑:
/etc/tomcat9/logging.properties
或:
/opt/tomcat/conf/logging.properties
增加:
org.apache.catalina.valves.AccessLogValve.level = FINE
org.apache.catalina.connector.level = FINE
org.apache.coyote.level = FINE
⚠️ 不要在生产长期开启,日志量巨大。
awk '$NF > 1000' localhost_access_log.*.txt
返回耗时 > 1000ms 的请求
grep "http-nio-8080-exec-3" catalina.out | less
| 场景 | 方法 |
|---|---|
| 某 IP 请求了什么 | AccessLog |
| 请求为什么 500 | AccessLog → catalina.out |
| 请求卡在哪 | 线程名 + 应用日志 |
| 慢请求 | %D + 线程分析 |
| 一个请求多次调用 | traceId + MDC |
| 请求是否被拒绝 | catalina.out + 线程池日志 |
✅ 生产环境推荐组合
如果你愿意,可以告诉我:
我可以给你 精确到配置文件的示例。