Linux下Tomcat日志分割的常用技巧
Tomcat默认将日志输出到catalina.out文件,长期运行会导致文件过大,占用大量磁盘空间且不利于日志分析。以下是几种高效的日志分割方法,覆盖不同场景需求:
Cronolog是一款轻量级日志分割工具,可根据时间(如天、小时)将日志拆分为多个文件,适合需要按时间归档的场景。
操作步骤:
yum install -y cronolog,安装后路径通常为/usr/sbin/cronolog。bin/catalina.sh文件,找到CATALINA_OUT变量定义(或>> "$CATALINA_OUT" 2>&1 &语句),替换为时间模板。例如:if [ -z "$CATALINA_OUT" ]; then
CATALINA_OUT="$CATALINA_BASE/logs/catalina.%Y-%m-%d.out" # 按天分割,文件名格式如catalina.2025-10-28.out
fi
同时,将日志输出语句修改为通过Cronolog管道传输(需覆盖所有>> "$CATALINA_OUT"的语句):org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/sbin/cronolog "$CATALINA_OUT" >> /dev/null &
bin/shutdown.sh && bin/startup.sh使配置生效。logs目录下,如catalina.2025-10-28.out、catalina.2025-10-29.out,无需手动清理旧文件(可通过find命令定期删除超过30天的文件)。Logrotate是Linux系统自带的日志管理工具,支持按大小、时间分割,还能自动压缩、删除旧日志,适合需要统一管理多个日志文件的场景。
操作步骤:
/etc/logrotate.d/下新建tomcat文件,内容如下(以catalina.out为例):/usr/local/tomcat/logs/catalina.out {
daily # 每天轮转(可选:weekly/monthly)
rotate 7 # 保留最近7份日志
compress # 压缩旧日志(如catalina.out.1.gz)
missingok # 若日志不存在也不报错
notifempty # 若日志为空则不轮转
copytruncate # 复制原日志后清空,避免重启Tomcat
dateext # 添加日期后缀(如catalina.out-20251028)
}
logrotate -d /etc/logrotate.d/tomcat模拟轮转,检查是否有错误。logrotate -f /etc/logrotate.d/tomcat立即轮转。/etc/cron.daily/logrotate每天自动运行,无需额外配置。catalina.out-20251028.gz),保留最近7天,自动清理过期日志。Log4j是Java生态中功能强大的日志框架,支持按时间、大小分割,还能自定义日志格式、输出目的地(如文件、数据库),适合需要精细化日志管理的场景(如Tomcat 8及以上版本)。
操作步骤:
log4j-api-2.x.jar和log4j-core-2.x.jar复制到Tomcat的lib目录。conf目录下新建log4j2.xml,内容如下(按天分割并压缩):<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="${catalina.base}/logs/app.log"
filePattern="${catalina.base}/logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 每天分割 -->
<SizeBasedTriggeringPolicy size="10MB"/> <!-- 单个文件超过10MB也分割 -->
</Policies>
<DefaultRolloverStrategy max="20"/> <!-- 最多保留20份 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
bin/catalina.sh,在JAVA_OPTS中添加Log4j配置文件路径:JAVA_OPTS="$JAVA_OPTS -Dlog4j.configurationFile=$CATALINA_BASE/conf/log4j2.xml"
bin/shutdown.sh && bin/startup.sh使配置生效。logs/app.log,并按日期和大小分割为app-2025-10-28-1.gz、app-2025-10-28-2.gz等文件,支持更灵活的日志管理。若无法修改Tomcat配置或安装工具,可通过Shell脚本定期备份并清空catalina.out,适合临时解决日志过大的问题。
示例脚本(保存为/usr/local/bin/clear_catalina.sh):
#!/bin/bash
LOG_DIR="/usr/local/tomcat/logs"
YESTERDAY=$(date -d "yesterday" +"%Y%m%d")
cp "$LOG_DIR/catalina.out" "$LOG_DIR/catalina.$YESTERDAY.out" # 备份
> "$LOG_DIR/catalina.out" # 清空当前日志
设置定时任务:通过crontab -e添加每天凌晨2点执行:
0 2 * * * /usr/local/bin/clear_catalina.sh
注意:此方法需手动执行或依赖定时任务,不如前几种方法自动化程度高,仅适合临时应急。
以上方法各有优缺点:Cronolog适合按时间归档,Logrotate适合系统统一管理,Log4j适合精细化需求,脚本适合临时解决。根据实际场景选择合适的方法,能有效解决Tomcat日志过大的问题。