温馨提示×

Linux下Node.js日志备份方法是什么

小樊
42
2025-12-29 00:16:22
栏目: 编程语言

Linux下Node.js日志备份方法

一 核心思路与准备

  • 明确日志路径:常见位置包括应用自定义目录(如**./logs/)、系统目录(如/var/log/)、PM2 管理的日志(~/.pm2/logs/),或 systemd 服务日志(用journalctl -u 服务名**查看)。定位准确路径是后续备份的前提。
  • 选择策略组合:优先使用系统自带的logrotate做日志轮转与本地归档,再用tar/rsync做周期性打包与异地/远程备份,必要时引入集中式日志(如 ELK/Fluentd)降低本地保留压力。
  • 权限与安全:备份目录建议设置为700,日志与备份文件权限最小化;敏感日志可在打包后使用GPG加密存储。

二 方法一 使用 logrotate 做日志轮转与本地归档

  • 适用场景:Node.js 直接写文件日志,需控制单文件大小与保留天数,并在轮转后让应用继续写入新文件。
  • 配置示例(创建文件:/etc/logrotate.d/nodejs):
/var/log/nodejs/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  create 0640 node node
  sharedscripts
  postrotate
    # 根据进程管理方式选择其一
    systemctl reload my-nodejs.service >/dev/null 2>&1 || true
    # 或 kill -USR1 $(cat /var/run/nodejs.pid) 2>/dev/null || true
  endscript
}
  • 说明:
    • daily/rotate 7/compress:按天轮转并保留7天,旧日志压缩。
    • postrotate:通知应用重新打开日志文件(systemd 用 reload,或向进程发送USR1;如使用 PM2,可安装pm2-logrotate插件实现同等效果)。
    • 测试与强制执行:
      • 校验配置:sudo logrotate -d /etc/logrotate.d/nodejs
      • 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs

三 方法二 使用 Shell 脚本配合 tar rsync 做周期性备份

  • 本地打包备份脚本(示例:/usr/local/bin/backup_logs.sh):
#!/bin/bash
set -e
LOG_DIR="/var/log/nodejs"
BACKUP_DIR="/backup/nodejs"
DATE=$(date +%Y%m%d)

mkdir -p "$BACKUP_DIR/$DATE"
tar -czf "$BACKUP_DIR/$DATE/app-$DATE.tar.gz" -C "$LOG_DIR" .
# 可选:加密
# gpg --symmetric --cipher-algo AES256 "$BACKUP_DIR/$DATE/app-$DATE.tar.gz"

# 清理30天前备份
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +30 -delete
  • 远程备份脚本(rsync 增量同步到备份服务器):
#!/bin/bash
BACKUP_DIR="/backup/nodejs"
REMOTE_USER="backup"
REMOTE_IP="192.168.1.100"
REMOTE_DIR="/remote/backup/nodejs"

rsync -avz --delete "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_IP:$REMOTE_DIR"
  • 定时任务(crontab -e):
# 每天 02:00 本地打包
0 2 * * * /usr/local/bin/backup_logs.sh
# 每天 03:00 远程同步
0 3 * * * /usr/local/bin/backup_logs_remote.sh
  • 提示:首次执行可先手动跑一遍脚本验证目录、权限与连通性。

四 方法三 应用内轮转与集中式日志

  • 应用内轮转(无需系统干预,便于按天/按大小切分):
    • Winston + winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');

const logger = winston.createLogger({
  transports: [
    new DailyRotateFile({
      filename: '/var/log/nodejs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    })
  ]
});
  • Pino 可配合 pino-rotate 实现类似能力。
  • 集中式日志管理(减少本地备份压力):将日志发送到ELK Stack(Elasticsearch+Logstash+Kibana)Fluentd,便于检索、可视化与长期留存。

五 恢复与校验及注意事项

  • 恢复步骤:
    • 本地归档恢复:tar -xzvf /backup/nodejs/app-2025-09-30.tar.gz -C /var/log/nodejs
    • 远程备份回灌:rsync -avz user@ip:/remote/backup/nodejs/ /backup/nodejs/ 再按需解压或直接使用。
  • 校验与监控:
    • 校验备份可用性(定期解压抽查、校验文件大小/数量)。
    • 监控日志体积与备份结果(如用Monit对日志大小告警,脚本检查备份是否生成并发送通知)。
  • 安全与保留:
    • 备份目录权限700,必要时对归档文件GPG加密;按合规要求设置保留周期(如本地7–14天、远程30天)。
  • 进程管理差异:
    • 直接运行:用systemctl reloadkill -USR1通知重新打开日志。
    • PM2:安装并配置pm2-logrotate插件统一轮转策略。

0