生产环境 Tomcat 日志终极方案:logrotate 实现 catalina.out 自动分割(零重启、高稳定)

一、前言:为什么必须分割 catalina.out

Tomcat 的catalina.out是服务器运行的核心日志,默认会持续累积且不自动分割。在生产环境中,该文件极易膨胀至数十 GB,不仅占用磁盘空间,还会导致日志查看卡顿、磁盘 IO 飙升,甚至因文件过大出现 Tomcat 日志输出异常的问题。而 Linux 系统自带的logrotate工具,无需修改 Tomcat 配置、无需重启服务,是实现catalina.out日志分割的最优方案。

二、方案优势(生产环境首选)

  • 零侵入无风险:无需修改 Tomcat 核心配置,无需重启服务,不影响业务运行。

  • 自动定时执行:系统自带定时任务,默认每日凌晨自动触发,无需额外配置定时脚本。

  • 灵活策略配置:支持按天分割、日期命名、自动压缩、过期清理,满足 7 个月长期留存需求。

  • 权限安全可控:可自定义日志文件权限,防止普通用户篡改日志

  • ✅ Linux自带工具logrotate

三、完整配置步骤(直接复制即用)

1. 创建 logrotate 配置文件

执行命令,新建 Tomcat 专属日志轮转配置:

复制代码
vim /etc/logrotate.d/tomcat

2. 写入核心配置(适配 7 个月留存)

粘贴以下内容,务必将日志路径替换为你服务器实际的catalina.out路径

复制代码
# 替换为你的catalina.out实际路径
/usr/local/tomcat/logs/catalina.out {
    daily                # 每天分割一次
    dateext              # 关键参数:强制使用日期作为后缀,禁用数字编号(.1/.2)
    dateformat .%Y-%m-%d # 分割后文件名带日期(如catalina.out.2026-05-22)
    rotate 210           # 保留210天(7个月)日志,超期自动删除
    compress              # 自动压缩旧日志(.gz格式,节省空间)
    delaycompress         # 延迟压缩,不影响当前日志使用
    copytruncate          # 复制原日志后清空,无需重启Tomcat(核心参数)
    missingok              # 日志文件不存在时不报错
    notifempty             # 日志为空时不执行分割
    create 0644 root root  # 新建日志文件权限644,属主root(安全可控)
}

3. 配置参数逐行解析(一目了然)

参数 作用说明
/usr/local/tomcat/logs/catalina.out 指定待分割的日志文件绝对路径
daily 轮转周期为每天,可选weekly/monthly
dateext 强制启用日期后缀,彻底禁用 .1/.2/.3 数字命名,所有日志统一按日期格式生成
dateformat .%Y-%m-%d 定义日期后缀格式,生成catalina.out.2026-05-22.gz
rotate 210 保留 210 个历史日志(7 个月),超出自动删除
compress 用 gzip 压缩分割后的日志,减少磁盘占用
copytruncate 核心参数:复制原日志内容后清空原文件,Tomcat 持续写入不中断
missingok 日志文件丢失时不抛出异常,避免定时任务报错
notifempty 当日志文件为空时,不执行分割操作,避免无效文件
create 0644 root root 分割后新建空日志文件,权限为-rw-r--r--,仅 root 可读写,其他用户只读

4. 配置生效与测试(无需等待凌晨)

(1)校验配置语法(无报错则配置正确)

复制代码
logrotate -d /etc/logrotate.d/tomcat
  • 输出无error提示,说明配置格式无误。

(2)手动强制触发分割(立即验证效果)

复制代码
logrotate -f /etc/logrotate.d/tomcat

(3)查看分割结果

进入日志目录,查看文件列表:

复制代码
cd /usr/local/tomcat/logs
ll
  • 效果展示:

    • catalina.out:当前正在写入的空日志文件(权限0644)。

    • catalina.out.2026-05-22.gz:已分割并压缩的历史日志(日期为当天)。

四、长期运行效果与维护说明

1. 日常运行状态

  • 每日凌晨自动分割,生成带日期的压缩日志,目录始终保留210 个以内日志文件(7 个月量)。

  • 单目录存 210 个文件对系统无负面影响:ext4/xfs 文件系统单目录默认支持数万文件,不会出现检索卡顿、性能下降问题。

2. 日志权限安全

0644权限(-rw-r--r--)安全性充足:

  • root 用户:可读、可写、可删除。

  • 普通用户:仅可读,无法修改、删除日志,防止日志被篡改或误删。

3. 无需额外维护

配置完成后,logrotate作为系统自带服务会永久生效,无需手动干预,仅需定期查看磁盘空间即可。

五、常见问题与避坑指南

1. 分割后 Tomcat 不写入日志

  • 原因:未配置copytruncate参数,或配置错误。

  • 解决:确保配置中包含copytruncate,该参数是实现 "零重启分割" 的核心。

2. 日志未按日期命名

  • 原因:缺少dateformat .%Y-%m-%d参数。

  • 解决:添加该参数,确保分割后文件名带日期,便于按天排查问题

3. 历史日志未自动删除

  • 原因:rotate数值设置过大,或磁盘空间不足。

  • 解决:确认rotate 210配置无误,清理磁盘冗余空间,确保 logrotate 有删除权限。

六、总结

通过logrotate配置catalina.out日志分割,是生产环境 Tomcat 日志管理的最优解 。该方案兼具稳定性、安全性和便捷性,无需重启服务、无需复杂脚本,仅需简单配置即可实现 "每日分割、自动压缩、7 个月留存、零风险运行" 的核心需求,彻底解决catalina.out日志膨胀问题,保障 Tomcat 服务稳定运行。

相关推荐
SamDeepThinking16 分钟前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
Zane199419 分钟前
接口都能写默认实现了,为什么还需要抽象类
java·后端
未秃头的程序猿22 分钟前
读Spring AI源码的方法——不是硬啃,是带着问题去翻
java·后端·spring
用户31268748772034 分钟前
别再 Thread.sleep 硬等了!并发工具类到底怎么选?
java
Java内核笔记36 分钟前
万字长文剖析 Spring Boot 4 自动配置机制源码:从 @EnableAutoConfiguration 到条件装配
java·后端
evans在进步41 分钟前
Spring MVC 核心机制详解:全局异常处理、请求跳转与数据绑定
java·spring·mvc
weixin_BYSJ19871 小时前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php
coder_lorraine1 小时前
Halo 2.x 回收站文章无法删除?一篇文章教你彻底解决
java·运维
索隆zoro1 小时前
Army 进阶:DML 操作体系与 Spring AI 集成
java
吃饱了得干活1 小时前
为什么你的Service越写越臃肿?三层架构的“业务逻辑层”是个黑盒
java·后端·架构