Linux日志自动归档需先归档再清理,用logrotate配置compress、dateext、olddir等实现本地压缩归档与周期清理;远程归档则需rsync+tar脚本配合crontab,并加入失败判断与兜底机制。

Linux服务器上日志自动归档不是单纯“删掉就完事”,而是保留价值、释放空间、便于追溯的闭环动作。核心思路是:先归档再清理,用定时任务驱动整个流程,避免人工遗漏或误操作。
用logrotate实现带归档的轮转清理
logrotate是系统级日志管理的首选工具,天然支持压缩归档和按策略清理,无需额外脚本。
- 配置中加入compress(自动gzip压缩)和dateext(用日期命名归档文件,如
messages-20260610),归档文件自带时间标识 - 设置olddir /var/log/archive,可将旧日志统一移到指定归档目录,与当前日志分离
- 搭配rotate 12和weekly,相当于保留近3个月的归档日志,既够排查又不占主目录空间
- 确保create选项存在,轮转后新建日志文件权限正确,服务不会因写入失败而中断
自定义脚本实现远程归档+本地清理
当归档目标是NAS、对象存储或另一台服务器时,logrotate无法直接完成,需Shell脚本配合crontab。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 用
rsync -az --remove-source-files把旧日志同步到远程目录,成功后再删本地源文件,避免中间态丢失 - 归档前用
find /var/log/app -name "*.log" -mtime +7 -print0 | xargs -0 tar -czf archive_$(date +%Y%m%d).tar.gz打包,减少传输次数 - 归档命令后加判断:
if [ $? -eq 0 ]; then rm -f *.tar.gz; else echo "归档失败,保留本地备份" >> /var/log/backup.log; fi - 脚本开头加上
set -e,任一命令失败即退出,防止清理动作在归档失败后误执行
归档前必做的三件事
归档不是技术动作,而是运维责任。跳过检查,可能让故障复盘变成无源之水。
- 确认日志归属:区分系统日志(/var/log/messages)、应用日志(/data/logs/myapp)和服务日志(/var/log/journal),不同类别归档周期和保留策略应不同
-
预览待处理文件:执行清理前先运行
find /var/log/app -name "*.log" -mtime +30 -ls,人工核对路径和时间范围,避免通配符误匹配 -
保护关键日志:对
/var/log/secure、/var/log/audit/等含认证信息的日志,归档后至少保留180天,且加密传输(如用gpg加密tar包)
让归档真正“自动化”的关键细节
定时任务本身很简单,但让它稳定跑三年不出问题,靠的是监控和兜底机制。
- crontab里不只写脚本路径,加上输出重定向:
0 3 * * * /usr/local/bin/rotate_and_archive.sh >> /var/log/rotate.log 2>&1,所有执行痕迹可查 - 在脚本末尾加入磁盘水位检查:
if [ $(df /var | awk 'NR==2 {print $5}' | sed 's/%//') -gt 90 ]; then journalctl --vacuum-size=200M; fi,防止归档失败导致空间告急 - 每月初自动校验归档完整性:用
md5sum生成归档包摘要并存到独立位置,下次归档前比对上月摘要是否变化 - 归档目录本身也设定时清理,例如
find /var/log/archive -name "*.tar.gz" -mtime +180 -delete,避免归档区反成新瓶颈

















