独立服务器日志定时自动清理脚本

脚本用于在独立服务器上定时自动清理日志文件,通过配置保留天数(如7天)和指定日志路径,结合Linux cron实现周期性执行,脚本使用find命令精准筛选并安全删除过期日志,支持日志轮转前的备份与压缩选项,并具备错误日志记录和执行通知功能,有效防止磁盘空间耗尽,提升系统稳定性与运维效率。

《轻装上阵:一个安全、可配置的独立服务器日志定时自动清理脚本》

运维实践中,独立服务器(如物理机专属云主机)的日志积累往往是“沉默的隐患”——Nginx访问日志系统journal、应用日志(如JavaPython服务输出)若长期不清理,轻则磁盘告警,重则触发OOM或服务中断,手动清理既低效又易遗漏,而盲目使用logrotate又可能因配置不当导致日志截断失败或权限异常。

为此,我们设计了一个轻量、透明、可审计的定时清理脚本——不依赖复杂框架,仅用标准Shell+crontab,兼顾安全性与可维护性。

脚本心逻辑分三层:
智能识别:自动扫描 /var/log/ 及常用应用目录(如 /opt/myapp/logs/),跳过正在被进程打开的活跃日志(通过lsof -t校验),避免误删;
分级保留:支持按“天数”(如保留30天)或“文件数”(如最多保留10个压缩归档)双策略,关键日志(如securemessages)默认启用更保守的保留策略;
安全清理:先Gzip压缩再rm删除,全程记录操作日志到/var/log/cleaner.log,含时间戳、清理路径、释放空间量(单位MB),便于回溯审计。

示例脚本片段(精简版):

#!/bin/Bash
KEEP_DAYS=30
LOG_ROOTS=("/var/log" "/opt/app/logs")
LOG_EXCLUDE=("*.tmp" "current.log" "debug.*")
for root in "${LOG_ROOTS[@]}"; do
  [ -d "$root" ] || continue
  find "$root" -type f \( -name "*.log" -o -name "*.out" \) \
    -mtime +$KEEP_DAYS \
    -not -exec lsof -t {} + 2>/dev/null \; \
    -print0 | while IFS= read -r -d '' file; do
      if [[ "$(basename "$file")" =~ ^(access|error|app)\.log$ ]]; then
        gzip -q "$file" && echo "$(date): compressed $file" >> /var/log/cleaner.log
      else
        rm -f "$file" && echo "$(date): removed $file" >> /var/log/cleaner.log
      fi
    done
done
# 记录本次释放空间
echo "$(date): cleaned $(du -sh /var/log | cut -f1) total" >> /var/log/cleaner.log

部署仅需三步:
1️⃣ 将脚本保存为/usr/local/bin/log-cleaner.sh,赋予执行权限(chmod +x);
2️⃣ 编辑crontab(sudo crontab -e),添加:
0 3 * * * /usr/local/bin/log-cleaner.sh >/dev/null 2>&1
(每日凌晨3点执行,避开业务高峰);
3️⃣ 首次运行前建议手动执行并检查日志,确认路径与策略符合预期。

⚠️ 注意事项:

  • 脚本默认跳过journalctl日志(应由systemd自身管理),如需清理请单独配置SystemMaxUse=参数;
  • 若应用使用log4j等框架,确保其配置未开启“永远追加”模式,否则可能生成超大单文件
  • 建议搭配df -h /监控告警,当根分区使用率>85%时触发人工介入。

这个脚本不追求“全自动黑盒”,而是把控制权交还给运维者——策略清晰、行为可查、修改简单,它不是万能解药,却是独立服务器稳定运行的一道务实防线,日志的价值在于“可用时有用”,而非“堆积时占坑”,让服务器真正轻装上阵,从一次干净的定时清理开始。(全文约980字)