温馨提示×

Tomcat日志为何在Ubuntu满

小樊
50
2026-07-21 21:41:48
栏目: 智能运维

这个问题常见但原因多样,我按最常见 → 较少见的顺序给你梳理。你可以对照排查。


一、最常见原因:日志没有轮转(Log Rotation 没生效)

1️⃣ Tomcat 自己不会自动清理日志

Tomcat 默认会持续往这些文件写日志:

catalina.out
localhost.log
host-manager.log
manager.log
...

Tomcat 本身不会自动删除或切割日志,尤其在 Ubuntu 上,如果没配置 logrotatecatalina.out 会无限增长。

解决方案:配置 logrotate

Ubuntu 上通常已有 /etc/logrotate.d/tomcat9(或 tomcat8 / tomcat10)

示例(推荐):

/var/log/tomcat9/catalina.out {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

然后测试:

sudo logrotate -d /etc/logrotate.d/tomcat9

二、应用日志写得太猛(最常见“真凶”)

2️⃣ 应用自身 log4j / logback 配置不当

很多情况是:

  • DEBUG / INFO 级别全开
  • 日志写到 catalina.out
  • 或写到 /var/log/tomcat*/ 下的自定义文件

检查:

du -sh /var/log/tomcat*

常见问题:

  • 没有日志滚动
  • 每个请求都打日志
  • 异常堆栈无限打印

解决建议

  • 生产环境 禁止 DEBUG
  • 使用异步日志
  • 明确日志文件路径,不要全打进 catalina.out

三、catalina.out 被重定向,无法轮转

3️⃣ systemd 把 stdout 重定向到 catalina.out

Ubuntu 用 systemd 启动 Tomcat 时:

StandardOutput=append:/var/log/tomcat9/catalina.out

这会导致:

  • logrotatecopytruncate 失效
  • 文件句柄一直占用,磁盘“看起来满了”

解决方式

编辑 systemd 配置:

sudo systemctl edit tomcat9

改为:

[Service]
StandardOutput=journal
StandardError=journal

然后:

sudo systemctl daemon-reload
sudo systemctl restart tomcat9

四、磁盘被“已删除但仍占用”的日志占满

4️⃣ 删了日志但 Tomcat 没重启

这是经典坑:

rm catalina.out

但磁盘没释放!

检查:

sudo lsof +L1

解决方式

  • 重启 Tomcat(最安全)
  • truncate 而不是 rm
: > /var/log/tomcat9/catalina.out

五、其他可能原因

5️⃣ 临时目录 /tmp 被占满

Tomcat 会写:

/tmp
/tmp/hsperfdata_*

检查:

df -h
du -sh /tmp

6️⃣ 日志级别 + 异常死循环

比如:

catch (Exception e) {
    log.error("error", e);
}

但异常不断被触发。

✅ 建议:

  • 异常只打一次
  • 加限流 / 熔断

快速排查清单(推荐顺序)

# 1. 看哪个目录最占空间
du -sh /var/log/tomcat*

# 2. 看磁盘
df -h

# 3. 看是否有已删除但未释放的文件
sudo lsof +L1

# 4. 看日志配置
ls /etc/logrotate.d/tomcat*

如果你愿意,我可以帮你精确定位

你可以贴出:

  1. Tomcat 版本(8 / 9 / 10)
  2. Ubuntu 版本
  3. df -h 输出
  4. du -sh /var/log/tomcat* 输出
  5. 是否使用 log4j / logback

我可以给你一套完全适合你环境的清理 + 防满方案

0