温馨提示×

Debian Tomcat日志中如何追踪请求

小樊
39
2026-06-30 17:10:37
栏目: 智能运维

在 Debian 上运行的 Tomcat 中追踪请求,通常可以从 访问日志、应用日志、线程与请求参数、以及调试级别日志 几个方面入手。下面按“最常用 → 进阶 → 排查技巧”的顺序说明。


一、最直接:Access Log(访问日志)

Tomcat 默认不会自动开启访问日志,但生产中一般会配置。

1️⃣ 确认是否开启 AccessLogValve

编辑配置文件(常见路径):

/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" />

2️⃣ 访问日志在哪

/var/log/tomcat9/localhost_access_log.*.txt

3️⃣ 追踪某次请求(推荐 pattern)

建议改成包含 请求时间 + 响应时间 + 线程名

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 找到请求线程名


二、通过线程名追踪完整请求过程(非常实用)

1️⃣ AccessLog 得到线程名

例如:

http-nio-8080-exec-3

2️⃣ 在 catalina.out 中过滤该线程

grep "http-nio-8080-exec-3" /var/log/tomcat9/catalina.out

你将看到该请求在 应用代码、过滤器、拦截器、异常栈 中的完整执行路径。


三、应用日志中追踪(SLF4J / Logback / Log4j)

✅ 最佳实践:打印 RequestId / TraceId

方案 1:在 Filter 中生成 requestId

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();
        }
    }
}

日志配置中输出 traceId

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

这是企业级最推荐方式


四、Tomcat 内部请求追踪(调试用)

1️⃣ 开启 Tomcat 调试日志

编辑:

/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

⚠️ 不要在生产长期开启,日志量巨大。


五、定位慢请求 / 高耗时请求

1️⃣ 利用 AccessLog 的 %D

awk '$NF > 1000' localhost_access_log.*.txt

返回耗时 > 1000ms 的请求

2️⃣ 结合线程名查哪一步慢

grep "http-nio-8080-exec-3" catalina.out | less

六、常见排查场景速查表

场景 方法
某 IP 请求了什么 AccessLog
请求为什么 500 AccessLog → catalina.out
请求卡在哪 线程名 + 应用日志
慢请求 %D + 线程分析
一个请求多次调用 traceId + MDC
请求是否被拒绝 catalina.out + 线程池日志

七、总结推荐方案(最佳实践)

生产环境推荐组合

  1. AccessLogValve(含线程名、耗时)
  2. 应用日志使用 MDC + traceId
  3. 不用 Tomcat DEBUG 日志

如果你愿意,可以告诉我:

  • Tomcat 版本(8 / 9 / 10)
  • 是否是 Spring Boot
  • 想追踪的是 性能问题 / 404 / 慢请求 / 异常

我可以给你 精确到配置文件的示例

0