温馨提示×

debian分卷的日志管理

小樊
44
2025-12-10 19:41:15
栏目: 智能运维

Debian分卷日志管理实践

一 核心概念与位置

  • 在 Debian 中,日志通常写入 /var/log,系统级日志由 rsyslog/journald 管理,应用日志也常落地到该目录。为避免单个日志过大或占满磁盘,采用“按大小或时间分卷”的轮转策略是标准做法,常用工具为 logrotate,它支持按日/按大小触发、压缩归档、保留份数与执行轮转后钩子脚本等能力。

二 使用 logrotate 实现按大小或时间分卷

  • 基本思路:为需要分卷的日志路径在 /etc/logrotate.d/ 下创建配置文件,设置触发条件(如 dailysize)、保留份数(rotate)、压缩(compress)、是否延迟压缩(delaycompress)、空文件不轮转(notifempty)、轮转后通知应用重新打开日志(postrotate)等。
  • 示例一 按大小分卷(通用应用)
    • 需求:单个日志达到 2 MB 即分卷,按日也触发,保留最近 30 份,压缩旧日志,轮转后通知应用重载。
    • 配置:创建 /etc/logrotate.d/myapp
      /var/log/myapp.log {
          daily
          size 2048k
          missingok
          rotate 30
          compress
          delaycompress
          notifempty
          create 640 root adm
          sharedscripts
          postrotate
              # 依据实际服务替换为 systemctl reload 或 kill -USR1 等
              systemctl reload myapp >/dev/null 2>&1 || true
          endscript
      }
      
    • 说明:size 触发优先于 daily;如应用不响应 reload,可改为发送信号或重启。
  • 示例二 系统日志与 Nginx 的常用做法
    • 系统日志(rsyslog 管理的 /var/log/syslog 等)
      /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 52
          compress
          delaycompress
          missingok
          notifempty
          create 0640 root adm
          sharedscripts
          postrotate
              /usr/lib/rsyslog/rsyslogd reload >/dev/null
          endscript
      }
      
    • Nginx 日志
      /var/log/nginx/*.log {
          daily
          rotate 7
          compress
          delaycompress
          missingok
          notifempty
          create 0640 www-data adm
          postrotate
              systemctl reload nginx >/dev/null
          endscript
      }
      
  • 测试与生效
    • 语法/执行计划检查:logrotate -d /etc/logrotate.conf
    • 强制执行一次:logrotate -f /etc/logrotate.d/myapp
    • 说明:logrotate 通常由 cron 每日任务自动调用,无需额外定时;如需立即验证,使用 -f 强制执行。

三 按时间分卷的替代方案

  • 应用内按时间分卷
    • Node.js:使用 winston + winston-daily-rotate-file,可按天/小时分卷并压缩,例如:
      const DailyRotateFile = require('winston-daily-rotate-file');
      const transport = new DailyRotateFile({
        filename: 'application-%DATE%.log',
        datePattern: 'YYYY-MM-DD-HH',
        zippedArchive: true,
        maxSize: '20m',
        maxFiles: '14d'
      });
      
    • Golang:使用 lumberjack,按大小与天数保留,例如:
      &lumberjack.Logger{
        Filename:   "/var/log/myapp.log",
        MaxSize:    10,     // MB
        MaxBackups: 3,      // 保留个数
        MaxAge:     28,     // 保留天数
        Compress:   true,    // 是否压缩
      }
      
    • Node.js 进程管理:使用 pm2 的 log_rotation 能力按天或按大小分割。
  • 何时选择应用内分卷
    • 需要精确到小时/分钟的分卷、结构化日志归档、或与日志采集/分析链路深度集成时更合适;系统级文本日志仍以 logrotate 为主。

四 systemd journal 日志的分卷与保留

  • 若主要使用 journald(而非文本文件),可通过 /etc/systemd/journald.conf 控制日志保留策略,例如设置最大保留时间、最大使用空间等,实现“按时间/容量”的自动清理与分卷归档(持久化到磁盘时同样生效)。
  • 常用查看与验证
    • 实时查看:journalctl -f
    • 按服务查看:journalctl -u nginx
    • 按时间查看:journalctl --since “2025-12-01”
  • 建议:在服务器上同时保留文本日志与 journal 日志时,分别配置各自的保留策略,避免重复占用磁盘。

五 运维要点与排错清单

  • 权限与属主:创建新日志文件时设置合适的权限与属主(如 create 0640 root admwww-data adm),避免应用无法写入。
  • 触发条件设计:同时设置 dailysize 可实现“双重触发”,既防止长期未轮转,也避免单文件过大。
  • 平滑重载:在 postrotate 中优先使用 systemctl reload 或发送 USR1 等信号,确保应用重新打开日志文件句柄,避免日志丢失。
  • 压缩与保留:启用 compressdelaycompress,合理设置 rotate 保留份数,既控体积又便于追溯。
  • 测试与验证:上线前用 logrotate -d/-f 做干跑与强制执行验证,观察是否按预期生成 .gz 归档与创建新文件。
  • 监控与告警:对 /var/log 所在分区设置磁盘使用率告警,防止因异常导致日志写满影响业务。

0