商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Ubuntu上Node.js日志备份方法

Ubuntu上Node.js日志备份方法

  发布于2026-07-02 阅读(0)

扫一扫,手机访问

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

Ubuntu上Node.js日志备份方法

1. 使用 logrotate 工具(系统级自动化轮转)

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。

2. 使用 rsync 命令(增量同步备份)

如果你的日志要同步到本地其他目录,或者异地备份,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 指定加密通道。
  • 自动化:把 rsync 命令写进 shell 脚本(比如 sync_logs.sh),然后用 cron 定时执行,例如每天凌晨 2 点跑一次:
    crontab -e
    添加 0 2 * * * /path/to/sync_logs.sh

3. 使用 tar 命令(压缩打包备份)

如果只是想做一次完整的快照打包,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(先切换目录再打包,避免路径层)。
  • 自动化:同样写进 shell 脚本(如 backup_logs.sh),通过 cron 定时执行,比如每周日凌晨 3 点:0 3 * * 0 /path/to/backup_logs.sh

4. 使用 Node.js 脚本(自定义备份逻辑)

当系统工具满足不了复杂需求时(比如按日期分割、上传到对象存储),可以自己写 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);
  • 定时执行:通过 cron 调用,例如每天凌晨 1 点:0 1 * * * /usr/bin/node /path/to/backup-logs.js

5. 结合 PM2 管理(进程级日志备份)

如果你的 Node.js 应用用 PM2 管理,那日志自动存在 ~/.pm2/logs/ 目录下,文件名是 app-name-out.logapp-name-err.log。这时候备份和清理可以这样搞:

  • 备份 PM2 日志:直接拿 rsync 或 tar 备份 ~/.pm2/logs/ 目录,比如:
    rsync -av ~/.pm2/logs/ /backup/pm2_logs/
  • 清理旧日志:PM2 自带 pm2 flush 命令可以清空当前日志,但更推荐定期删除过期文件,比如保留最近 7 天:
    find ~/.pm2/logs/ -type f -name "*.log" -mtime +7 -exec rm {} ;
  • 自动化:把备份和清理命令写进一个脚本,加进 cron,每天凌晨跑一次就行。

每种方法各有侧重:logrotate 最省心,rsync 适合异地,tar 适合归档,Node.js 脚本适合定制,PM2 环境则直接复用进程管理机制。选哪个主要看你的备份策略和磁盘空间预算。动手试一下就心里有数了。

本文转载于:https://www.yisu.com/ask/14953720.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注