位置:首页 > JavaScript > Ubuntu 下 Node.js 日志如何实现自动化备份

Ubuntu 下 Node.js 日志如何实现自动化备份

时间:2026-08-25  |  作者:实验室老王  |  阅读:0

目录

  1. 用 logrotate 做本机日志轮转
  2. 用 Shell 脚本配合 cron 做定制备份
  3. PM2 应用直接接入 pm2-logrotate
  4. 需要异地容灾时,用 rsync 同步到远程服务器
  5. 4 种方案该怎么选

前言

Node.js 服务一旦持续运行,日志文件就会很快变成磁盘压力和运维负担;只靠手动清理,既不稳定,也很难兼顾留档与排障。本文把 Ubuntu 下常见的 4 种日志自动化备份方案拆开讲清楚:什么时候该用 logrotate,什么时候适合脚本、PM2 模块或 rsync,同步给出配置命令和选择依据。

Node.js 服务跑久之后,日志文件通常会持续增长,最后带来磁盘占用、清理不及时和排障记录丢失等问题。要在 Ubuntu 上把这件事做成可长期运行的机制,核心就是先分清需求:你是只想定期轮转压缩,还是要定制备份逻辑,或者还要把日志同步到远程服务器。下面按实际使用场景,把 4 种常见做法拆开说明,并给出对应命令与配置重点。

用 logrotate 做本机日志轮转

如果你的目标是让日志按天切分、自动压缩、定期删除旧文件,那么 Ubuntu 自带的 logrotate 通常是最省事的方案。它原生支持轮转、压缩、保留数量控制和异常容错,适合绝大多数部署在单机或普通服务器上的 Node.js 应用。

展示 logrotate 在 Ubuntu 中处理 Node.js 日志的轮转规则与执行方式。
logrotate 轮转规则一图看懂用一张白底信息图梳理 logrotate 的轮转频率、保留数量、压缩策略和系统自动执行关系。

先确认工具是否已安装

大多数 Ubuntu 环境已经自带 logrotate,如果没有,可以直接安装:

展示 Shell 脚本加 cron 方案中的备份、命名、清理和日志记录流程。
脚本备份流程与保留策略突出脚本方案的关键环节:打包源日志、按时间戳命名、保留 30 天和将输出写入。
sudo apt install logrotate

在 /etc/logrotate.d/ 下创建应用配置

可以在 /etc/logrotate.d/ 目录中新建一个配置文件,比如 nodejs_app,并按你的日志路径调整内容:

/path/to/your/nodejs/app/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
}

这组配置的含义比较直接:

  • daily:每天轮转一次日志。
  • rotate 7:保留最近 7 天的历史日志。
  • compress:旧日志会压缩为 gzip,减少磁盘占用。
  • delaycompress:延迟压缩,避免刚轮转的日志立即被压缩。
  • missingok:日志文件不存在时不报错,适合不稳定生成的日志路径。
  • notifempty:空日志不轮转,避免产生无意义归档。
  • create 0640 root adm:轮转后重新创建新日志文件,并设置权限。

上线前先手动验证

配置写完后,建议先跑一次强制测试,确认轮转、创建和压缩都符合预期:

sudo logrotate -vf /etc/logrotate.d/nodejs_app

如果测试正常,就不需要额外再配定时任务了。Ubuntu 默认会通过 /etc/cron.daily/logrotate 每天执行一次,后续会自动按规则运行。

用 Shell 脚本配合 cron 做定制备份

当你不只是想“轮转日志”,而是希望把日志打包成归档文件,或者顺手附带清理策略、校验逻辑、目录整理等处理,自定义脚本会更灵活。这个方案的核心思路是:脚本负责备份动作,cron 负责定时触发。

创建备份脚本

例如把脚本放到 /usr/local/bin/backup_nodejs_logs.sh

#!/bin/bash
LOG_DIR="/path/to/your/nodejs/app/logs"
BACKUP_DIR="/path/to/backup/nodejs_logs"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/logs_backup_${DATE}.tar.gz"

mkdir -p "$BACKUP_DIR"

tar -czf "$BACKUP_FILE" -C "$LOG_DIR" .

find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +30 -exec rm {} ;

这个脚本完成了几件事:先定义日志目录和备份目录,再用时间戳生成归档文件名,然后把整个日志目录压缩为 .tar.gz,最后删除超过 30 天的旧备份,避免备份目录无限增长。

给脚本执行权限

chmod +x /usr/local/bin/backup_nodejs_logs.sh

用 cron 定时执行

编辑当前用户的定时任务:

crontab -e

例如设置为每天凌晨 2 点执行一次:

0 2 * * * /usr/local/bin/backup_nodejs_logs.sh >> /path/to/backup/logs/backup.log 2>&1

这里把标准输出和错误输出都追加到了 /path/to/backup/logs/backup.log。这样做的好处是,备份失败、目录不存在、权限异常等问题都能留下记录,后续排查比只看 cron 邮件更直接。

这个方案的优势在于扩展空间大。比如你可以在脚本里增加备份成功校验、按项目分类归档,或者接入额外通知逻辑。它不如 logrotate 省心,但在“要按业务规则处理日志”时更合适。

PM2 应用直接接入 pm2-logrotate

如果你的 Node.js 服务本身就是通过 PM2 托管的,那么单独再给日志套一层系统脚本,未必是最顺手的方式。PM2 提供的 pm2-logrotate 模块,可以直接围绕 PM2 日志做轮转和保留控制,配置门槛也比较低。

安装模块

pm2 install pm2-logrotate

设置关键参数

安装后,可以通过 pm2 set pm2-logrotate: 调整规则,例如:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
  • max_size 10M:单个日志文件超过 10MB 时触发轮转。
  • retain 7:保留最近 7 个备份。
  • compress true:压缩旧日志。
  • dateFormat YYYY-MM-DD_HH-mm-ss:指定轮转后日志文件名里的时间格式。

适合什么场景

这种方式最适合已经全面使用 PM2 管理进程的项目。日志默认位于 ~/.pm2/logs/,相关轮转和保留都能在 PM2 体系内处理,部署和迁移时也更统一。对于运维上已经依赖 PM2 的团队来说,它比单独维护系统级配置更省事。

需要异地容灾时,用 rsync 同步到远程服务器

前面的几种方案主要解决的是“本机日志如何自动整理和保留”。如果你的需求升级为异地备份,或者希望把日志同步到另一台服务器、云主机或备份节点,那么 rsync 配合 cron 会更靠谱。

先配置 SSH 免密登录

为了让定时同步可以无人值守运行,通常要先打通 SSH 免密:

ssh-keygen -t rsa
ssh-copy-id user@remote-server

第一条命令用于在本地生成密钥对,第二条会把公钥复制到远程服务器对应用户下。配置完成后,后续定时任务就不需要每次人工输入密码。

设置同步任务

继续编辑 crontab -e,加入每日同步规则,例如每天凌晨 3 点执行:

0 3 * * * rsync -a vz --delete /path/to/your/nodejs/app/logs/ user@remote-server:/backup/nodejs_logs/

这条命令会把本地日志目录同步到远程服务器的 /backup/nodejs_logs/。其中比较关键的是 --delete 参数:如果本地已经删除某些文件,远程对应文件也会一起删除,从而保持两边目录一致。

需要注意的是,这种“镜像同步”更偏向容灾和副本一致性,而不是长期归档。换句话说,如果你想保留被本地删除的旧日志,就要谨慎使用 --delete,或者在远端额外设计归档目录和保留策略。

4 种方案该怎么选

把这几种方式放在一起看,选择其实主要取决于你的日志管理目标:

展示本机轮转、PM2 管理与 rsync 异地同步三类场景的选择关系。
不同场景下的方案选择用对比式信息图帮助读者快速判断:普通服务器、PM2 托管应用和异地容灾分别适合哪种方案。
  • 如果只是做日常轮转、压缩和保留控制,优先选 logrotate,维护成本最低。
  • 如果需要自定义打包、清理或校验逻辑,选 Shell 脚本加 cron 更灵活。
  • 如果应用由 PM2 托管,直接使用 pm2-logrotate 往往最顺手。
  • 如果有异地备份或容灾要求,再叠加 rsync 做远程同步。

实际部署中,这几种方式也并不是完全互斥。比如本机可以先用 logrotatepm2-logrotate 控制日志膨胀,再通过脚本或 rsync 做额外备份。关键不是工具越多越好,而是让轮转、保留和容灾职责分清楚,避免规则重叠后反而把日志处理链路弄复杂。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多