Ubuntu上Node.js日志备份的常见方法
logrotate是Ubuntu系统自带的日志管理工具,可自动完成Node.js日志的轮转、压缩、删除及保留策略配置。
sudo apt update && sudo apt install logrotate/etc/logrotate.d/目录下新建文件(如nodejs_app),内容示例如下(需替换为实际日志路径):/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 # 重启Node.js进程以重新打开日志文件(需替换为实际PID文件路径) endscript } sudo logrotate -vf /etc/logrotate.d/nodejs_app(-v显示详细过程,-f强制立即轮转)/etc/cron.daily/logrotate定时任务每天执行,无需额外配置。rsync是高效的文件同步工具,适合将Node.js日志同步到本地其他目录或远程服务器,支持增量备份(仅传输变化的部分)。
/backup/logs目录):rsync -av --delete /var/log/nodejs/ /backup/logs/ 参数说明:-a(归档模式,保留文件属性)、-v(详细输出)、--delete(删除目标目录中源目录不存在的文件,保持一致性)。/remote/logs目录):rsync -avz -e ssh /var/log/nodejs/ user@remote-server:/remote/logs/ 参数说明:-z(压缩传输)、-e ssh(通过SSH加密传输)。sync_logs.sh),并通过cron定时执行(如每天凌晨2点):crontab -e 添加以下内容:0 2 * * * /path/to/sync_logs.sh。tar命令可将Node.js日志打包成压缩文件(如.tar.gz),适合一次性完整备份。
/var/log/nodejs/目录下的所有.log文件打包到/backup/logs):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点):crontab -e 添加以下内容: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); crontab -e 添加以下内容:0 1 * * * /usr/bin/node /path/to/backup-logs.js。若使用PM2管理Node.js应用,其日志默认存储在~/.pm2/logs/目录下(格式为app-name-out.log和app-name-err.log),可通过以下方式备份:
~/.pm2/logs/目录,示例如下:rsync -av ~/.pm2/logs/ /backup/pm2_logs/ logs命令清理旧日志(如保留最近7天的日志):pm2 flush 或编写脚本定期删除旧日志文件(如超过7天的文件):find ~/.pm2/logs/ -type f -name "*.log" -mtime +7 -exec rm {} \;