温馨提示×

Debian Node.js日志备份与恢复策略

小樊
37
2025-12-14 10:03:32
栏目: 编程语言

Debian Node.js 日志备份与恢复策略

一 策略总览与分层

  • 本地轮转与保留:使用 logrotate 按日轮转、压缩、保留7–30天,避免单文件过大与磁盘占满。
  • 本地归档备份:每日将已轮转的日志归档到 /backup/logs/YYYY-MM-DD/,并保留7–30天
  • 远程与异地备份:通过 rsync 增量同步到备份服务器,或用 duplicity 做加密增量备份到对象存储/远程主机。
  • 集中化与长期留存:将关键日志发送到 rsyslog/syslog-ngsystemd-journald 并转发至 ELK/Grafana Loki 等平台,便于检索与审计。
  • 监控与演练:对“备份成功/失败”“日志体积异常”设置告警,并定期演练恢复与校验完整性。

二 本地轮转与保留

  • 配置 logrotate(示例路径:/etc/logrotate.d/nodejs),适配常见 Node.js 日志目录(如 /var/log/nodejs/ 或应用自定义目录):
/var/log/nodejs/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
    sharedscripts
    postrotate
        # 若以 systemd 管理,推荐:systemctl reload node-app.service
        # 若以 PID 文件管理,可用:kill -USR1 $(cat /var/run/node.pid 2>/dev/null) || true
    endscript
}
  • 调试与生效:
    • 语法检查:sudo logrotate -d /etc/logrotate.d/nodejs
    • 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs
  • 说明:轮转后旧日志以 .gz 形式保留,配合保留天数实现本地“版本化”。

三 本地归档与远程备份

  • 本地归档脚本(每日一次,保留14天):
#!/usr/bin/env bash
set -Eeuo pipefail
LOG_DIR="/var/log/nodejs"
BACKUP_BASE="/backup/logs"
DATE=$(date +%F)

mkdir -p "$BACKUP_BASE/$DATE"
# 仅归档已轮转的旧日志(避免与正在写入的 current 冲突)
find "$LOG_DIR" -maxdepth 1 -name "*.gz" -mtime -1 -exec cp -p {} "$BACKUP_BASE/$DATE/" \;

# 可选:打包归档
tar -czf "$BACKUP_BASE/nodejs-$DATE.tar.gz" -C "$BACKUP_BASE/$DATE" .

# 清理超过14天的归档
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +14 -delete
find "$BACKUP_BASE" -maxdepth 1 -name "nodejs-*.tar.gz" -mtime +14 -delete

# 简单成功标记
echo "$(date -Iseconds) backup success" >> "$BACKUP_BASE/backup.log"
  • 远程备份(rsync 增量到备份机):
rsync -avz --delete /backup/logs/ backup@192.0.2.10:/data/backups/nodejs/
  • 加密增量备份(duplicity 到远程主机或对象存储):
duplicity --full-if-older-than 7D \
  --no-encryption \
  /backup/logs/ rsync://backup@192.0.2.10//data/backups/nodejs-duplicity/
  • 定时任务(crontab):
# 每日 02:00 本地归档
0 2 * * * /usr/local/bin/backup_nodejs_logs.sh

# 每日 03:00 远程同步
0 3 * * * rsync -avz --delete /backup/logs/ backup@192.0.2.10:/data/backups/nodejs/
  • 提示:远程备份建议配置 SSH 免密登录与最小权限的备份账号。

四 恢复流程与校验

  • 定位日志与权限:确认日志目录(如 /var/log/nodejs/),检查权限(示例:chmod 644 /var/log/nodejs/*.log)。
  • 从本地归档恢复(按日期目录):
DATE="2025-12-10"
tar -xzf /backup/logs/nodejs-$DATE.tar.gz -C /tmp/restore
cp -p /tmp/restore/*.gz /var/log/nodejs/
# 若应用使用文件句柄写入,必要时触发日志重新打开:
# systemctl reload node-app.service 或 kill -USR1 <node_pid>
  • 从 rsync 备份恢复:
rsync -av /backup/logs/nodejs/ /var/log/nodejs/
  • 校验与回放:
    • 完整性:zcat /var/log/nodejs/app.log.*.gz | head/tail 检查是否可读、时间线是否连续。
    • 应用侧:确认日志库(如 Winston/Pino/Bunyan)配置正常,无路径/权限错误。
  • 建议:恢复后在测试环境回放关键时间段的日志,验证解析与告警链路。

五 监控告警与演练

  • 文件大小与备份结果监控:
    • Prometheus 示例规则(告警阈值可按需调整):
groups:
- name: nodejs_logs
  rules:
  - alert: LargeLogFileSize
    expr: nodejs_log_file_size_bytes > 100000000
    for: 1h
    labels:
      severity: warning
    annotations:
      summary: "日志文件过大"
      description: "实例 {{ $labels.instance }} 日志超过 100MB。"
  - alert: LogBackupFailed
    expr: nodejs_backup_success{job="nodejs-backup"} == 0
    for: 15m
    labels:
      severity: critical
    annotations:
      summary: "日志备份失败"
      description: "节点 {{ $labels.instance }} 最近一次备份未成功。"
  • 采集方式:用 node_exporter textfilePromtail + Loki 暴露日志体积与备份状态指标。
  • 进程与轮转健康:
    • 使用 Monit 监控日志文件大小与备份任务进程,异常时告警并尝试恢复。
  • 定期演练:
    • 每周自动恢复上周归档到隔离目录,执行“可解析性/关键字检索/告警回放”检查,结果写入 /backup/logs/backup.log
  • 日志规范:在应用侧使用结构化日志(如 JSON)、合理级别(error/warn/info/debug),便于检索与审计。

0