Ubuntu Tomcat日志分割与归档方法
一 方案总览与选择
| 方案 | 适用场景 | 优点 | 注意点 |
|---|---|---|---|
| logrotate | 系统自带、最小改动、对运行中进程安全 | 配置简单、可压缩与保留策略、自动按日/大小触发 | 对持续写入的 catalina.out 建议使用 copytruncate,存在极小概率丢行 |
| cronolog | 希望按时间自动命名并持续滚动 | 按天/小时精准切分、无需额外清理脚本 | 需修改 catalina.sh 启动管道,注意 Tomcat 7/8 修改位置差异 |
| Log4j2 滚动文件 | 使用 JULI 重定向或切换到 Log4j2 | 功能最灵活(时间+大小、保留策略、异步) | 需引入依赖与配置,变更类加载器与日志框架 |
二 使用 logrotate 对 catalina.out 进行分割与归档
/path/to/tomcat/logs/catalina.out {
copytruncate
daily
rotate 15
compress
missingok
size 200M
dateext
}
sudo logrotate -f /etc/logrotate.d/tomcatls -lh /path/to/tomcat/logs/ 应出现类似 catalina.out-2025-11-20.gz 的文件。三 使用 cronolog 按时间分割 catalina.out
sudo apt-get update
sudo apt-get install -y cronolog
# 或源码安装(示例)
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure && make && sudo make install
which cronolog # 常见路径:/usr/local/sbin/cronolog
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE/logs/catalina.%Y-%m-%d.out"
fi
# touch "$CATALINA_OUT"org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| /usr/local/sbin/cronolog "$CATALINA_OUT" >> /dev/null &
find /path/to/tomcat/logs -name "catalina.*.out" -mtime +7 -delete
四 使用 Log4j2 实现按时间与大小滚动归档
<Configuration status="warn" packages="org.apache.logging.log4j.core">
<Appenders>
<RollingFile name="RollingFile"
fileName="/opt/tomcat/logs/catalina.log"
filePattern="/opt/tomcat/logs/catalina.%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"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
JAVA_OPTS="$JAVA_OPTS -Dlog4j.configurationFile=$CATALINA_BASE/conf/log4j2.xml"
export JAVA_OPTS
五 归档与清理策略及运维建议
#!/usr/bin/env bash
LOG_DIR="/opt/tomcat/logs"
BAK_DIR="/backup/tomcat"
DATE=$(date +%Y%m%d)
tar -czf "$BAK_DIR/tomcat_logs_$DATE.tar.gz" -C "$LOG_DIR" catalina.*.log localhost_access_log.*.txt
find "$LOG_DIR" -name "catalina.*.log" -mtime +7 -delete
find "$LOG_DIR" -name "localhost_access_log.*.txt" -mtime +7 -delete
0 2 * * 0 /usr/local/bin/backup_tomcat_logs.sh。> catalina.out 清空或采用 copytruncate。