Java应用日志需通过cron定时归档清理:保留7天原始日志,90天压缩包,归档至独立目录,脚本含路径校验、进程保护及错误退出机制,并配置每日凌晨2:30执行。

Java 应用在 Linux 线上环境运行时,日志文件(如 application.log、catalina.out 或自定义的 xxx.log)容易随时间增长,占用大量磁盘空间。通过 cron 定期执行归档与清理脚本,是稳定、低侵入的运维方案。
明确归档与清理策略
归档不是简单压缩,而是按时间维度分类处理:保留近期可读日志(如最近 7 天),将更早的日志打包压缩并移至归档目录,最后删除超期压缩包(如超过 90 天)。避免直接 rm -f *.log,防止误删正在写入的日志或影响 Java 进程。
- 建议以日期为单位切割日志(如 Logback 配置
TimeBasedRollingPolicy),便于按天归档 - 归档目录建议独立于应用日志目录(例如
/data/logs/archive/),避免和运行时日志混杂 - 清理阈值需结合磁盘容量与审计要求设定,常见为“保留 30 天原始日志 + 90 天压缩包”
编写安全可靠的归档清理脚本
脚本需具备路径校验、进程保护、错误退出机制。以下是一个典型 archive_clean.sh 示例(保存为 /opt/scripts/log_archive.sh):
#!/bin/bash
# 日志根目录(Java 应用实际输出路径)
LOG_DIR="/data/app/logs"
ARCHIVE_DIR="/data/logs/archive"
DAYS_KEEP_RAW=7
DAYS_KEEP_ARCHIVE=90
<h1>校验目录存在</h1><p>[ ! -d "$LOG_DIR" ] && echo "ERROR: $LOG_DIR not exist" >&2 && exit 1
[ ! -d "$ARCHIVE_DIR" ] && mkdir -p "$ARCHIVE_DIR"</p><h1>归档:将 $LOG_DIR 下 7 天前的 .log 文件打包(排除正在写入的 active 日志)</h1><p>find "$LOG_DIR" -name "*.log" -type f -mtime +$DAYS_KEEP_RAW ! -name "application.log" ! -name "catalina.out" | while read file; do
if [ -s "$file" ]; then
date<em>str=$(date -d "@$(stat -c %Y "$file")" +%Y%m%d</em>%H%M%S 2>/dev/null || echo "unknown")
tar -C "$LOG_DIR" -cf "$ARCHIVE<em>DIR/$(basename "$file" .log)</em>$date_str.tar" "$(basename "$file")" 2>/dev/null && \
rm -f "$file"
fi
done</p><h1>清理过期归档包</h1><p>find "$ARCHIVE_DIR" -name "*.tar" -type f -mtime +$DAYS_KEEP_ARCHIVE -delete</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a></a>”;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill3637" title="Docker Container Cleaner"><img
src="https://img.php.cn/upload/skill/000/000/081/178973465451150.jpg" alt="Docker Container Cleaner" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill3637" title="Docker Container Cleaner">Docker Container Cleaner</a>
<p>CLI工具,用于清理已停止的Docker容器、未使用的镜像、卷和网络,释放磁盘空间。</p>
</div>
<a href="/xiazai/skill3637" title="Docker Container Cleaner" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>可选:压缩残留大日志(如 catalina.out 超过 100MB 且 1 天未更新)</h1><p>if [ -f "$LOG_DIR/catalina.out" ] && [ $(stat -c %s "$LOG_DIR/catalina.out" 2>/dev/null) -gt 104857600 ] && \
[ $(find "$LOG_DIR/catalina.out" -mmin +1440 | wc -l) -eq 1 ]; then
gzip "$LOG_DIR/catalina.out"
fi
赋予执行权限:chmod +x /opt/scripts/log_archive.sh
配置 cron 定时任务
使用系统级 crontab(避免依赖用户 session),推荐用 sudo crontab -e 添加:
# 每天凌晨 2:30 执行归档清理 30 2 * * * /opt/scripts/log_archive.sh >> /var/log/log_archive.log 2>&1
注意要点:
- 脚本中所有路径使用绝对路径(
/data/app/logs而非./logs) - 重定向日志便于排查(
>>追加,不覆盖;2>&1合并错误输出) - 避免在脚本中使用
cd切换目录,cron 默认工作路径不确定 - 测试时先手动运行脚本,确认无误再加入 cron
验证与监控建议
上线后需持续观察效果:
- 检查
/var/log/log_archive.log是否有报错(如权限拒绝、find 找不到文件) - 用
df -h对比前后磁盘使用率变化 - 抽查归档目录中 tar 包是否完整、可解压:
tar -tf /data/logs/archive/*.tar | head -n 5 - 对关键应用,可在脚本末尾添加磁盘告警逻辑(如剩余空间

















