Ubuntu Tomcat日志分割与归档方法
导读:Ubuntu Tomcat日志分割与归档方法 一 方案总览与选择 下表对比三种常用方案,便于按场景选择: 方案 适用场景 优点 注意点 logrotate 系统自带、最小改动、对运行中进程安全 配置简单、可压缩与保留策略、...
Ubuntu Tomcat日志分割与归档方法
一 方案总览与选择
- 下表对比三种常用方案,便于按场景选择:
| 方案 | 适用场景 | 优点 | 注意点 |
|---|---|---|---|
| logrotate | 系统自带、最小改动、对运行中进程安全 | 配置简单、可压缩与保留策略、自动按日/大小触发 | 对持续写入的 catalina.out 建议使用 copytruncate,存在极小概率丢行 |
| cronolog | 希望按时间自动命名并持续滚动 | 按天/小时精准切分、无需额外清理脚本 | 需修改 catalina.sh 启动管道,注意 Tomcat 7/8 修改位置差异 |
| Log4j2 滚动文件 | 使用 JULI 重定向或切换到 Log4j2 | 功能最灵活(时间+大小、保留策略、异步) | 需引入依赖与配置,变更类加载器与日志框架 |
二 使用 logrotate 对 catalina.out 进行分割与归档
- 创建配置文件 /etc/logrotate.d/tomcat,示例:
/path/to/tomcat/logs/catalina.out {
copytruncate
daily
rotate 15
compress
missingok
size 200M
dateext
}
- 关键参数说明:
- copytruncate:先复制再清空,适配持续写入的 catalina.out(与 create 互斥)。
- daily / size 200M:满足任一条件即轮转。
- rotate 15:保留最近 15 个归档。
- compress:使用 gzip 压缩旧日志。
- missingok:日志缺失不报错。
- dateext:归档名追加日期后缀,便于检索。
- 测试与生效:
- 手动触发一次轮转:
sudo logrotate -f /etc/logrotate.d/tomcat - 验证:
ls -lh /path/to/tomcat/logs/应出现类似 catalina.out-2025-11-20.gz 的文件。
- 手动触发一次轮转:
- 说明:Ubuntu 的 logrotate 由 /etc/cron.daily/logrotate 每日定时执行,无需额外定时任务。
三 使用 cronolog 按时间分割 catalina.out
- 安装 cronolog(若仓库无包,可源码安装):
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
- 修改 $CATALINA_HOME/bin/catalina.sh:
- 设置输出文件名格式(两处需要修改,Tomcat 7/8 位置略有差异):
if [ -z "$CATALINA_OUT" ] ;
then
CATALINA_OUT="$CATALINA_BASE/logs/catalina.%Y-%m-%d.out"
fi
- 注释创建空文件的行:
# touch "$CATALINA_OUT" - 将启动行改为管道输出到 cronolog(两处):
org.apache.catalina.startup.Bootstrap "$@" start 2>
&
1 \
| /usr/local/sbin/cronolog "$CATALINA_OUT" >
>
/dev/null &
- 重启 Tomcat 后,日志将按日期生成,如 catalina.2025-11-20.out。
- 清理旧日志(示例保留 7 天):
find /path/to/tomcat/logs -name "catalina.*.out" -mtime +7 -delete
- 提示:cronolog 方式天然按时间切分,通常不再需要 logrotate 对 catalina.out 做轮转。
四 使用 Log4j2 实现按时间与大小滚动归档
- 适用前提:将 Tomcat 的 JULI 日志重定向到 Log4j2,或直接由应用使用 Log4j2。
- 依赖与配置步骤(示例):
- 将 log4j-core-2.x.jar、log4j-api-2.x.jar、tomcat-juli-adapters.jar 放入 $CATALINA_HOME/lib,并配置 $CATALINA_HOME/conf/logging.properties 使用 JULI-to-Log4j2 桥接,或在启动脚本中指定 Log4j2 配置文件。
- 在 $CATALINA_HOME/conf/log4j2.xml 中配置基于时间与大小的滚动策略(示例):
<
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>
- 在 catalina.sh 添加 JVM 参数(如使用外部配置):
JAVA_OPTS="$JAVA_OPTS -Dlog4j.configurationFile=$CATALINA_BASE/conf/log4j2.xml"
export JAVA_OPTS
- 重启 Tomcat 后,将按天与大小滚动并压缩归档,保留 20 个历史文件。
五 归档与清理策略及运维建议
- 归档策略:
- 短期保留在本地 7–15 天并压缩,长期可结合脚本打包后上传至对象存储或备份服务器(示例打包并清理 7 天前日志):
#!/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
- 将脚本加入 crontab,如每周日凌晨执行:
0 2 * * 0 /usr/local/bin/backup_tomcat_logs.sh。 - 运维要点:
- 分割方式选择:优先用 cronolog/Log4j2 做“源头切分”;若不便改动启动脚本,使用 logrotate + copytruncate 更稳妥。
- 避免直接删除正在写入的 catalina.out,可能导致句柄异常;使用
> catalina.out清空或采用 copytruncate。 - 权限与属主:确保 Tomcat 用户对日志目录与文件具备写权限(如 640 root adm 或对应运行用户)。
- 监控与告警:对日志目录设置磁盘使用率告警,定期抽检归档完整性与可读性。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Tomcat日志分割与归档方法
本文地址: https://pptw.com/jishu/752599.html
