温馨提示×

Debian怎样进行日志文件回收

小樊
45
2025-12-26 05:28:52
栏目: 智能运维

Debian日志回收与轮转实践

一 核心机制与总体思路

  • 使用 logrotate/var/log 下的各类日志进行按时间或大小的轮转、压缩与删除,配置文件位于 /etc/logrotate.conf/etc/logrotate.d/ 目录,通常由 cron 每日自动触发(检查 /etc/cron.daily/logrotate 是否存在)。
  • 使用 journalctl 管理 systemd-journald 的结构化日志,按时间或总大小回收旧日志。
  • 不建议直接用 rm 删除正在写入的日志文件,避免影响正在运行的程序与后续轮转;如需临时释放空间,可先清空(如 : > /var/log/syslog),但更推荐走 logrotate 的 postrotate 重载机制。

二 使用 logrotate 进行日志轮转

  • 安装与检查
    • 安装:sudo apt-get update && sudo apt-get install logrotate
    • 验证:logrotate --version
    • 自动执行:确认 /etc/cron.daily/logrotate 存在并启用。
  • 全局与自定义配置
    • 全局:/etc/logrotate.conf(可设置全局默认策略)
    • 应用:/etc/logrotate.d/ 下为各服务单独配置(如 rsyslog、apache2 等)。
  • 常用参数说明
    • daily/weekly/monthly:轮转周期
    • rotate N:保留 N 个旧日志
    • compress/delaycompress:压缩旧日志(delaycompress 常用于配合服务重载)
    • missingok:日志缺失不报错
    • notifempty:空文件不轮转
    • create MODE OWNER GROUP:轮转后新建日志文件的权限与属主属组
    • sharedscripts/postrotate/endscript:多文件时仅执行一次脚本,常用于 service reload 让服务重新打开日志文件。
  • 示例
    • 系统日志(rsyslog)示例(/etc/logrotate.d/rsyslog):
      /var/log/syslog
      /var/log/mail.info
      /var/log/mail.warn
      /var/log/mail.err
      /var/log/mail.log
      /var/log/daemon.log
      /var/log/kern.log
      /var/log/auth.log
      /var/log/user.log
      /var/log/lpr.log
      /var/log/cron.log
      /var/log/debug
      /var/log/messages {
          weekly
          rotate 4
          compress
          delaycompress
          missingok
          notifempty
          create 0640 root adm
          sharedscripts
          postrotate
              /usr/lib/rsyslog/rsyslogd reload > /dev/null 2>&1 || true
          endscript
      }
      
    • Apache 示例(/etc/logrotate.d/apache2):
      /var/log/apache2/*.log {
          daily
          missingok
          rotate 7
          compress
          delaycompress
          notifempty
          create 640 root adm
          sharedscripts
          postrotate
              if [ -x /usr/sbin/invoke-rc.d ]; then
                  /usr/sbin/invoke-rc.d apache2 reload >/dev/null 2>&1 || true
              fi
          endscript
      }
      
  • 测试与执行
    • 语法检查:sudo logrotate -d /etc/logrotate.d/rsyslog
    • 强制执行:sudo logrotate -f /etc/logrotate.d/rsyslog
    • 全局执行:sudo logrotate -f /etc/logrotate.conf

三 使用 journalctl 回收 systemd 日志

  • 按时间保留:例如仅保留最近 2 周
    • sudo journalctl --vacuum-time=2weeks
  • 按大小保留:例如总日志不超过 100MB
    • sudo journalctl --vacuum-size=100M
  • 建议将上限写入配置,持久化生效(编辑 /etc/systemd/journald.conf):
    • SystemMaxUse=100M
    • MaxRetentionSec=2weeks
    • 使配置生效:sudo systemctl restart systemd-journald

四 手动清理与风险规避

  • 临时释放空间(不建议作为常规手段)
    • 清空而非删除正在写入的日志:: > /var/log/syslog
    • 删除已轮转的旧压缩包:find /var/log -name "*.gz" -mtime +30 -delete
  • 风险与建议
    • 直接 rm 正在写入的日志可能导致应用无法继续写入或 logrotate 状态异常;如需手动清理,优先使用 : > 清空,或先停止写入再处理,随后用 logrotate 正常轮转。
    • 清理前确认是否有合规或排障需求,保留必要的历史日志。

五 快速排查与常用命令

  • 查看磁盘占用:sudo du -sh /var/log/* | sort -h
  • 查找大文件:sudo find / -type f -size +1G 2>/dev/null
  • 检查 logrotate 是否每日执行:ls /etc/cron.daily/logrotate
  • 测试单个配置:sudo logrotate -d /etc/logrotate.d/rsyslog
  • 强制执行:sudo logrotate -f /etc/logrotate.d/rsyslog
  • 查看 systemd 日志占用与上限:journalctl --disk-usage;编辑 /etc/systemd/journald.conf 设置 SystemMaxUseMaxRetentionSec 后重启 systemd-journald

0