温馨提示×

如何定位ubuntu tomcat慢日志

小樊
32
2026-09-06 16:28:00
栏目: 智能运维

在 Ubuntu 上定位 Tomcat 的“慢日志”(请求处理慢、启动慢、响应慢等),可以按下面几个方向系统排查。


一、先明确你要找的是哪种“慢”

Tomcat 常见慢分为:

  1. 请求处理慢(某个接口响应时间长)
  2. Tomcat 启动慢
  3. 访问静态资源慢
  4. GC 导致整体变慢
  5. 线程池满导致排队

不同慢,日志位置和分析方式不同。


二、Tomcat 自身日志位置(Ubuntu)

默认安装路径(apt 安装):

/var/log/tomcat9/        # tomcat9 示例

常见日志文件:

catalina.out     # 最重要,标准输出和异常
catalina.YYYY-MM-DD.log
localhost.YYYY-MM-DD.log
localhost_access_log.YYYY-MM-DD.txt  # 访问日志(关键)

如果是手动安装:

$TOMCAT_HOME/logs/

三、开启并分析访问日志(最关键)

1. 确认 access log 已开启

编辑:

/etc/tomcat9/server.xml

确保有:

<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 是请求耗时(毫秒)


2. 找出慢请求

cd /var/log/tomcat9
grep "localhost_access_log" *.txt | awk '{print $NF, $0}' | sort -n | tail -20

或:

cat localhost_access_log.*.txt | sort -k 10 -n | tail

示例:

GET /api/order HTTP/1.1 200 12345

12345 = 12 秒,明显慢


四、开启 Tomcat 慢请求日志(推荐)

Tomcat 7+ 支持 慢请求检测

<Valve className="org.apache.catalina.valves.StuckThreadDetectionValve"
       threshold="10" />
  • threshold="10":超过 10 秒视为“卡住线程”
  • 日志会打到 catalina.out

示例日志:

SEVERE: Thread ... was previously reported to be stuck but has completed.

五、定位是应用慢还是 Tomcat 慢

1. 看线程状态

jstack <tomcat_pid> > tomcat.log

分析:

grep -A 20 "http-nio" tomcat.log

常见:

  • RUNNABLE + 长时间 → 业务代码慢
  • BLOCKED → 锁竞争
  • WAITING → 外部依赖(DB、Redis)

2. 看 GC 是否频繁

jstat -gcutil <pid> 1000

如果:

  • FGC 很多
  • OU 接近 100%

说明 GC 导致慢。


六、Tomcat 启动慢的常见原因

1. 熵池不足(非常常见)

现象:

  • 启动卡在 Creation of SecureRandom

解决:

vim $JAVA_HOME/jre/lib/security/java.security

改为:

securerandom.source=file:/dev/urandom

或启动参数:

-Djava.security.egd=file:/dev/./urandom

2. 部署应用太多 / @PostConstruct 慢

看:

catalina.out

搜索:

Deployment of web application

七、系统层面排查(Ubuntu)

1. CPU / IO

top
iostat -x 1

2. 文件描述符

ulimit -n

Tomcat 高并发建议 ≥ 65535


八、推荐排查顺序(实战)

  1. access_log + %D → 定位慢接口
  2. StuckThreadDetectionValve → 找卡线程
  3. jstack → 看线程在干嘛
  4. jstat → 看 GC
  5. catalina.out → 看异常和启动卡点

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

  • Tomcat 版本
  • Ubuntu 版本
  • 启动慢 还是 接口慢
  • 是否有 catalina.out 日志片段

我可以直接帮你分析具体原因。

0