生产环境 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 服务稳定运行。

相关推荐
luck_bor9 分钟前
File类&递归作业
java·开发语言
武子康28 分钟前
Java-07 深入浅出 MyBatis数据库一对多关系模型实战:表结构设计与查询实现
java·后端
REDcker2 小时前
Linux OverlayFS详解
java·linux·运维
Royzst3 小时前
xml知识点
java·服务器·前端
鱼鳞_3 小时前
苍穹外卖-Day08(缓存套餐)
java·redis·缓存
过期动态3 小时前
【LeetCode 热题 100】移动零
java·数据结构·算法·leetcode·职场和发展·rabbitmq
sinat_255487815 小时前
IDEA:查找文件/类
java·ide·设计模式·intellij-idea
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第77题】【Mysql篇】第7题:回表查询与全表扫描的区别?
java·开发语言·数据库·mysql·面试
lulu12165440785 小时前
Claude Code SpringBoot技能体系架构设计与演进
java·人工智能·spring boot·后端·ai编程
callJJ6 小时前
Nacos 详解——从概念到实战
java·spring boot·spring·spring cloud·微服务·nacos