如何设置Debian Node.js日志备份策略
导读:Debian Node.js 日志备份策略 策略总览 采用“本地轮转 + 离线归档 + 远程复制”三层策略: 本地轮转:用 logrotate 按日切割、压缩、保留历史,避免单文件过大与磁盘占满。 离线归档:将已轮转的日志按周/月打包归...
Debian Node.js 日志备份策略
策略总览
- 采用“本地轮转 + 离线归档 + 远程复制”三层策略:
- 本地轮转:用 logrotate 按日切割、压缩、保留历史,避免单文件过大与磁盘占满。
- 离线归档:将已轮转的日志按周/月打包归档,长期保存或用于审计。
- 远程复制:用 rsync 将归档同步到备份服务器/对象存储,提升可靠性与灾备能力。
- 可选集中化:将日志发送到 syslog/journald 或 ELK 等集中系统,便于检索与告警。
本地轮转与清理
-
使用 logrotate 管理 Node.js 应用日志(适用于直接写文件的场景):
- 安装与放置配置
- 安装:
sudo apt-get install logrotate - 新建配置:
sudo nano /etc/logrotate.d/nodejs-app
- 安装:
- 推荐配置示例(按日轮转,保留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 通知应用重新打开日志文件。
- 关键点:
- 测试与生效
- 语法检查:
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 做检索、可视化与告警。
- 使用 rsyslog 转发到远程日志服务器(编辑
监控与演练
- 容量与异常监控
- 监控日志目录容量(如
/var/log/nodejs、/backup)并设置告警,避免磁盘被占满导致应用异常。 - 对关键错误关键字(如 ERROR/Exception/FATAL)设置告警,缩短故障发现时间。
- 监控日志目录容量(如
- 定期恢复演练
- 从归档中抽样解压验证可用性:
tar -tzf /backup/logs/weekly/2025-W35/nodejs-2025-W35.tar.gz - 必要时将归档拷回日志目录并验证应用能正常读取历史日志(只读验证为主,避免影响线上写入)。
- 从归档中抽样解压验证可用性:
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何设置Debian Node.js日志备份策略
本文地址: https://pptw.com/jishu/789423.html
