Node.js 服务跑久之后,日志文件通常会持续增长,最后带来磁盘占用、清理不及时和排障记录丢失等问题。要在 Ubuntu 上把这件事做成可长期运行的机制,核心就是先分清需求:你是只想定期轮转压缩,还是要定制备份逻辑,或者还要把日志同步到远程服务器。下面按实际使用场景,把 4 种常见做法拆开说明,并给出对应命令与配置重点。
用 logrotate 做本机日志轮转
如果你的目标是让日志按天切分、自动压缩、定期删除旧文件,那么 Ubuntu 自带的 logrotate 通常是最省事的方案。它原生支持轮转、压缩、保留数量控制和异常容错,适合绝大多数部署在单机或普通服务器上的 Node.js 应用。

先确认工具是否已安装
大多数 Ubuntu 环境已经自带 logrotate,如果没有,可以直接安装:

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 种方案该怎么选
把这几种方式放在一起看,选择其实主要取决于你的日志管理目标:

- 如果只是做日常轮转、压缩和保留控制,优先选
logrotate,维护成本最低。 - 如果需要自定义打包、清理或校验逻辑,选 Shell 脚本加
cron更灵活。 - 如果应用由 PM2 托管,直接使用
pm2-logrotate往往最顺手。 - 如果有异地备份或容灾要求,再叠加
rsync做远程同步。
实际部署中,这几种方式也并不是完全互斥。比如本机可以先用 logrotate 或 pm2-logrotate 控制日志膨胀,再通过脚本或 rsync 做额外备份。关键不是工具越多越好,而是让轮转、保留和容灾职责分清楚,避免规则重叠后反而把日志处理链路弄复杂。







