发布于2026-07-02 阅读(0)
扫一扫,手机访问
在 Ubuntu 系统上给 Node.js 应用做日志备份,其实是个挺常见的运维需求。后台服务跑久了,日志文件会越长越肥,不处理的话,轻则磁盘报警,重则服务都可能挂掉。下面梳理了几种主流的备份方法,从系统自带工具到自定义脚本都有,可以根据实际场景灵活选。

logrotate 是 Ubuntu 系统自带的日志管理利器,基本上一行配置就能搞定 Node.js 日志的轮转、压缩、删除和保留策略。好处是无需额外守护进程,完全依赖 cron 每日自动执行。
sudo apt update && sudo apt install logrotate/etc/logrotate.d/ 目录下新建一个文件,比如 nodejs_app,内容如下(记得把日志路径和 PID 文件路径换成实际的):/var/log/nodejs/*.log {
daily # 每天轮转
rotate 7 # 保留最近7份日志
compress # 压缩旧日志(.gz格式)
missingok # 日志文件不存在也不报错
notifempty # 空日志不轮转
create 0640 root adm # 创建新日志文件并设置权限
sharedscripts # 所有日志处理完后统一执行postrotate脚本
postrotate
/bin/kill -HUP $(cat /var/run/nodejs.pid 2>/dev/null) 2>/dev/null || true
endscript
}sudo logrotate -vf /etc/logrotate.d/nodejs_app(加 -v 看详细过程,-f 强制立即执行)/etc/cron.daily/logrotate 每天执行,无需额外设置 cron。如果你的日志要同步到本地其他目录,或者异地备份,rsync 是首选。它只传输变化的部分,效率很高。
/backup/logs):rsync -av --delete /var/log/nodejs/ /backup/logs/参数说明:-a(归档模式,保留权限时间戳)、-v(详细输出)、--delete(删除目标中源端不存在的文件,保持两边一致)rsync -avz -e ssh /var/log/nodejs/ user@remote-server:/remote/logs/-z 启用压缩,-e ssh 指定加密通道。sync_logs.sh),然后用 cron 定时执行,例如每天凌晨 2 点跑一次:crontab -e添加 0 2 * * * /path/to/sync_logs.sh。如果只是想做一次完整的快照打包,tar 最直接。打包成 .tar.gz 文件,便于存档或下载。
/var/log/nodejs/ 下所有 .log 文件打包到备份目录,文件名自动加上时间戳):tar -czvf /backup/logs/logs_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /var/log/nodejs .参数:-c(创建归档)、-z(gzip 压缩)、-v(现场输出)、-f(指定文件名)、-C(先切换目录再打包,避免路径层)。backup_logs.sh),通过 cron 定时执行,比如每周日凌晨 3 点:0 3 * * 0 /path/to/backup_logs.sh。当系统工具满足不了复杂需求时(比如按日期分割、上传到对象存储),可以自己写 Node.js 脚本来实现。完全掌控每一步逻辑。
backup-logs.js):const fs = require('fs');
const path = require('path');
// 配置日志路径和备份目录
const logFilePath = '/var/log/nodejs/app.log';
const backupDir = '/backup/logs';
// 创建备份目录(若不存在)
if (!fs.existsSync(backupDir)) {
fs.mkdirSync(backupDir, { recursive: true });
}
// 生成带时间戳的备份文件名
const timestamp = new Date().toISOString().slice(0, 10);
const destPath = path.join(backupDir, `app_${timestamp}.log`);
// 复制日志文件
const readStream = fs.createReadStream(logFilePath);
const writeStream = fs.createWriteStream(destPath);
readStream.on('error', (err) => console.error('读取日志失败:', err));
writeStream.on('error', (err) => console.error('写入备份失败:', err));
writeStream.on('finish', () => console.log('备份成功:', destPath));
readStream.pipe(writeStream);0 1 * * * /usr/bin/node /path/to/backup-logs.js。如果你的 Node.js 应用用 PM2 管理,那日志自动存在 ~/.pm2/logs/ 目录下,文件名是 app-name-out.log 和 app-name-err.log。这时候备份和清理可以这样搞:
~/.pm2/logs/ 目录,比如:rsync -av ~/.pm2/logs/ /backup/pm2_logs/pm2 flush 命令可以清空当前日志,但更推荐定期删除过期文件,比如保留最近 7 天:find ~/.pm2/logs/ -type f -name "*.log" -mtime +7 -exec rm {} ;每种方法各有侧重:logrotate 最省心,rsync 适合异地,tar 适合归档,Node.js 脚本适合定制,PM2 环境则直接复用进程管理机制。选哪个主要看你的备份策略和磁盘空间预算。动手试一下就心里有数了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8