温馨提示×

如何设置Debian Node.js日志备份策略

小樊
36
2026-01-06 21:25:19
栏目: 编程语言

Debian Node.js 日志备份策略

策略总览

  • 采用“本地轮转 + 离线归档 + 远程复制”三层策略:
    • 本地轮转:用 logrotate 按日切割、压缩、保留历史,避免单文件过大与磁盘占满。
    • 离线归档:将已轮转的日志按周/月打包归档,长期保存或用于审计。
    • 远程复制:用 rsync 将归档同步到备份服务器/对象存储,提升可靠性与灾备能力。
    • 可选集中化:将日志发送到 syslog/journaldELK 等集中系统,便于检索与告警。

本地轮转与清理

  • 使用 logrotate 管理 Node.js 应用日志(适用于直接写文件的场景):

    1. 安装与放置配置
      • 安装:sudo apt-get install logrotate
      • 新建配置:sudo nano /etc/logrotate.d/nodejs-app
    2. 推荐配置示例(按日轮转,保留7天,压缩旧日志)
      /var/log/nodejs/*.log {
          daily
          rotate 7
          compress
          delaycompress
          missingok
          notifempty
          create 0644 root adm
          sharedscripts
          postrotate
              # 按实际进程信号选择其一
              systemctl reload node-app.service >/dev/null 2>&1 || true
              # 或 kill -USR1 $(cat /var/run/node.pid 2>/dev/null) || true
              # 若用 pm2,可改为:pm2 reload app_name >/dev/null 2>&1
          endscript
      }
      
      • 关键点:
        • 使用 copytruncate 可在不支持信号的应用中避免重启(但存在极小概率丢日志的风险)。
        • 使用 postrotate 发送 SIGHUP/USR1 或执行 systemctl reload 通知应用重新打开日志文件。
    3. 测试与生效
      • 语法检查:sudo logrotate -d /etc/logrotate.d/nodejs-app
      • 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs-app
      • 验证:检查是否生成 app.log-YYYYMMDD.gz 与新 app.log,并确认应用日志继续写入新文件。
  • 若使用 PM2 管理进程,可直接启用内置日志轮转插件(与系统 logrotate 二选一,避免重复轮转):

    • 安装与配置:
      pm2 install pm2-logrotate
      pm2 set pm2-logrotate:max_size 10M
      pm2 set pm2-logrotate:retain 30
      pm2 set pm2-logrotate:compress true
      pm2 set pm2-logrotate:rotateInterval "0 0 * * *"
      pm2 restart all
      
    • 日志默认位于 ~/.pm2/logs/,由 PM2 自动切割与保留。

离线归档与远程复制

  • 归档脚本示例(按打包上周日志,并清理已归档的原始轮转文件)
    • 保存为:/usr/local/bin/archive_nodejs_logs.sh
      #!/usr/bin/env bash
      set -Eeuo pipefail
      
      LOG_DIR="/var/log/nodejs"
      ARCHIVE_BASE="/backup/logs"
      DATE=$(date -d "last week" +%Y-%m-%d)
      WEEK=$(date -d "last week" +%Y-W%V)
      ARCHIVE_DIR="$ARCHIVE_BASE/weekly/$WEEK"
      
      mkdir -p "$ARCHIVE_DIR"
      
      # 归档上周已轮转的 .gz 文件(按周粒度)
      find "$LOG_DIR" -maxdepth 1 -name "*.gz" -newermt "$DATE 00:00:00" ! -newermt "$(date +%Y-%m-%d) 00:00:00" \
        -exec tar -czf "$ARCHIVE_DIR/nodejs-$WEEK.tar.gz" -C "$LOG_DIR" {} +
      
      # 可选:清理已成功归档的原始 .gz(谨慎,确保归档成功再执行)
      # find "$LOG_DIR" -maxdepth 1 -name "*.gz" -newermt "$DATE 00:00:00" ! -newermt "$(date +%Y-%m-%d) 00:00:00" -delete
      
      # 简单校验
      ls -lh "$ARCHIVE_DIR"
      
    • 赋权:sudo chmod +x /usr/local/bin/archive_nodejs_logs.sh
    • 定时执行(每周日凌晨 2:00 归档上周日志):
      0 2 * * 0 /usr/local/bin/archive_nodejs_logs.sh >> /var/log/archive_nodejs.log 2>&1
      
  • 远程复制(将归档目录同步到备份服务器)
    • 示例脚本:/usr/local/bin/sync_logs_remote.sh
      #!/usr/bin/env bash
      set -Eeuo pipefail
      rsync -avz --delete /backup/logs/ backup-user@192.0.2.10:/backup/nodejs/
      
    • 定时执行(每日 3:00 同步前一天的归档):
      0 3 * * * /usr/local/bin/sync_logs_remote.sh >> /var/log/sync_logs_remote.log 2>&1
      
  • 说明:
    • 归档周期可按需改为按月;远程目标可为 NFS/对象存储挂载SSH 服务器

集中化与远程日志

  • 将 Node.js 日志发送到 systemd-journald/rsyslog,便于集中管理与远程传输:
    • 使用 rsyslog 转发到远程日志服务器(编辑 /etc/rsyslog.conf/etc/rsyslog.d/remote.conf):
      *.* @192.0.2.20:514    # UDP
      *.* @@192.0.2.20:514   # TCP
      
    • 重启 rsyslog:sudo systemctl restart rsyslog
    • 也可结合 ELK/Graylog 做检索、可视化与告警。

监控与演练

  • 容量与异常监控
    • 监控日志目录容量(如 /var/log/nodejs/backup)并设置告警,避免磁盘被占满导致应用异常。
    • 对关键错误关键字(如 ERROR/Exception/FATAL)设置告警,缩短故障发现时间。
  • 定期恢复演练
    • 从归档中抽样解压验证可用性:tar -tzf /backup/logs/weekly/2025-W35/nodejs-2025-W35.tar.gz
    • 必要时将归档拷回日志目录并验证应用能正常读取历史日志(只读验证为主,避免影响线上写入)。

0