Debian Tomcat日志过大的处理方案
一、紧急止血
- 定位大文件:
- 查看占用:sudo du -sh /opt/tomcat/logs/* | sort -hr | head
- 实时看增长:sudo tail -f /opt/tomcat/logs/catalina.out
- 安全释放空间(不中断服务优先):
- 备份并清空标准输出:
- sudo mv /opt/tomcat/logs/catalina.out /opt/tomcat/logs/catalina.out.$(date +%F)
- sudo touch /opt/tomcat/logs/catalina.out
- sudo chown tomcat:tomcat /opt/tomcat/logs/catalina.out
- 如为 systemd 托管,也可用:sudo systemctl kill -s USR1 tomcat(触发日志轮转,视配置生效)
- 风险提示:直接删除正在写入的日志可能导致应用日志丢失或句柄异常,生产环境优先“备份后清空”或走轮转。
二、长期治理方案对比
| 方案 |
适用场景 |
关键配置 |
优点 |
注意点 |
| logrotate |
系统自带、统一运维 |
/etc/logrotate.d/tomcat;daily;rotate 7;compress;missingok;copytruncate;size 100M |
简单可靠、集中管理、可压缩归档 |
使用 copytruncate 可能对正在写入的文件有短暂影响;需确保权限与路径正确 |
| cronolog 按日切割 catalina.out |
希望按天自动生成新文件 |
安装 cronolog;在 bin/catalina.sh 将启动行改为通过 cronolog 打开 “${CATALINA_BASE}/logs/catalina.%Y-%m-%d.out” |
天然按天分割,文件不会无限增大 |
需修改启动脚本并重启;与某些部署脚本兼容性需验证 |
| 调整 logging.properties 级别 |
日志量过大由业务/框架输出导致 |
将 FileHandler/AsyncFileHandler 的 level 调为 WARNING/ERROR |
从源头减少日志量 |
可能影响排障,建议分级调整并灰度观察 |
以上三种方式可单独或组合使用(如:cronolog 按天切割 + logrotate 做压缩与清理)。
三、操作步骤示例
- 方案A logrotate(推荐)
- 新建配置:sudo vim /etc/logrotate.d/tomcat
- 写入示例:
/opt/tomcat/logs/catalina.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
size 100M
create 0644 tomcat tomcat
}
- 测试:sudo logrotate -d /etc/logrotate.conf
- 立即执行:sudo logrotate -f /etc/logrotate.d/tomcat
- 方案B cronolog 按日切割
- 安装:sudo apt-get install -y cronolog
- 编辑:sudo vim /opt/tomcat/bin/catalina.sh
- 注释或移除对 catalina.out 的 touch
- 找到类似:
org.apache.catalina.startup.Bootstrap “$@” start >> “$CATALINA_OUT” 2>&1 &
替换为:
org.apache.catalina.startup.Bootstrap “$@” start “/usr/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out” /dev/null 2>&1 &
- 重启:sudo systemctl restart tomcat
- 方案C 降低日志级别
- 编辑:sudo vim /opt/tomcat/conf/logging.properties
- 将 FileHandler/AsyncFileHandler 的 level 调整为 WARNING 或更高(如 ERROR)
- 重启:sudo systemctl restart tomcat
- 方案D 脚本清理旧日志(配合上面任一方案)
- 新建脚本:sudo vim /opt/tomcat/bin/clean_tomcat_logs.sh
#!/bin/bash
LOG_DIR=“/opt/tomcat/logs”
find “$LOG_DIR” -type f -name “catalina..log" -mtime +14 -delete
find “$LOG_DIR” -type f -name "localhost..log” -mtime +14 -delete
find “$LOG_DIR” -type f -name “*.gz” -mtime +30 -delete
- 赋权:sudo chmod +x /opt/tomcat/bin/clean_tomcat_logs.sh
- 定时:sudo crontab -e 添加
0 2 * * * /opt/tomcat/bin/clean_tomcat_logs.sh
四、预防与运维建议
- 统一策略:生产环境建议“按日切割 + 压缩归档 + 定期清理”,如保留7–14天并压缩,超过30天删除归档。
- 权限与属主:确保 Tomcat 用户对日志目录与文件具备写入权限,常见为 tomcat:tomcat。
- 监控告警:对日志目录设置磁盘使用率告警(如阈值80%),提前处理。
- 应用侧治理:减少不必要的 debug/trace 输出,异步日志(AsyncFileHandler)可提升性能并配合缓冲。
- 变更验证:修改 catalina.sh 或 logging.properties 后先在测试环境验证,再滚动发布。