Node.js在Ubuntu上的日志备份方案
logrotate是Ubuntu系统默认的日志管理工具,可自动实现日志的轮转、压缩、删除及通知,完美适配Node.js应用日志管理需求。
sudo apt install logrotate完成安装。/etc/logrotate.d/目录下创建专属配置文件(如nodejs-app),添加以下内容(需根据实际日志路径调整):/path/to/your/nodejs/app/logs/*.log {
daily # 每天轮转日志
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 若日志文件不存在,不报错
notifempty # 若日志为空,不轮转
create 0640 root adm # 新日志文件的权限与所有者
sharedscripts # 所有日志处理完成后统一执行脚本
postrotate # 轮转后执行的命令(重启Node.js进程以应用新日志)
/usr/sbin/killall -HUP node 2>/dev/null || true
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs-app测试配置语法(无错误则继续);若需立即执行,用sudo logrotate -f /etc/logrotate.d/nodejs-app强制运行。若需异地备份(如云端或另一台服务器),可通过rsync实现增量同步,确保日志安全。
sudo apt install rsync安装。backup_nodejs_logs.sh,内容如下(替换为实际路径):#!/bin/bash
LOG_DIR="/path/to/your/nodejs/app/logs" # 源日志目录
BACKUP_DIR="user@remote-server:/path/to/backup/logs" # 远程备份目录(需提前配置SSH免密)
rsync -avz --delete "$LOG_DIR/" "$BACKUP_DIR" # 同步日志(--delete删除远程多余文件)
echo "$(date '+%Y-%m-%d %H:%M:%S') Backup completed." >> /var/log/backup.log # 记录备份日志
chmod +x backup_nodejs_logs.sh。crontab -e添加以下内容(如每天凌晨2点执行):0 2 * * * /path/to/backup_nodejs_logs.sh
rsync仅传输变化部分,效率高,适合大量日志文件的远程备份。
适合需要将日志归档为单个文件的场景,便于存储或转移。
backup_nodejs_logs_tar.sh,内容如下:#!/bin/bash
LOG_DIR="/path/to/your/nodejs/app/logs" # 源日志目录
BACKUP_DIR="/path/to/backup/logs" # 本地备份目录
DATE=$(date +%Y%m%d_%H%M%S) # 当前日期时间(用于文件名)
mkdir -p "$BACKUP_DIR/$DATE" # 创建日期子目录
tar -czf "$BACKUP_DIR/$DATE/nodejs_logs_$DATE.tar.gz" -C "$LOG_DIR" . # 打包压缩日志
find "$BACKUP_DIR" -type d -mtime +30 -exec rm -rf {} \; # 删除30天前的备份(保留30天)
chmod +x backup_nodejs_logs_tar.sh。crontab -e添加以下内容(如每天凌晨1点执行):0 1 * * * /path/to/backup_nodejs_logs_tar.sh
此方法生成的.tar.gz文件便于长期存储,且通过find命令自动清理旧备份,节省磁盘空间。
若使用pm2管理Node.js进程,可直接利用pm2的内置日志切割功能,简化配置。
pm2 set pm2-logrotate:max_size 1G # 单个日志文件最大1GB
pm2 set pm2-logrotate:retain 30 # 保留最近30个日志文件
pm2 set pm2-logrotate:compress true # 压缩旧日志
pm2 restart app_name使配置生效。若需更复杂的备份逻辑(如备份到多个位置、发送邮件通知),可编写自定义Shell脚本。
advanced_backup.sh,内容如下:#!/bin/bash
LOG_DIR="/path/to/your/nodejs/app/logs"
LOCAL_BACKUP="/path/to/local/backup"
REMOTE_BACKUP="user@remote-server:/path/to/remote/backup"
DATE=$(date +%Y%m%d)
# 本地备份(压缩)
mkdir -p "$LOCAL_BACKUP/$DATE"
cp -r "$LOG_DIR"/* "$LOCAL_BACKUP/$DATE"
tar -czf "$LOCAL_BACKUP/$DATE/nodejs_logs_$DATE.tar.gz" -C "$LOCAL_BACKUP/$DATE" .
rm -rf "$LOCAL_BACKUP/$DATE" # 删除解压后的原始日志
# 远程备份(rsync)
rsync -avz "$LOCAL_BACKUP/$DATE" "$REMOTE_BACKUP"
# 发送邮件通知(需配置mailutils)
echo "Node.js logs backup completed on $DATE" | mail -s "Backup Notification" your_email@example.com
chmod +x advanced_backup.sh。crontab -e添加以下内容(如每天23:59执行):59 23 * * * /path/to/advanced_backup.sh
此方案可根据需求扩展(如添加加密、上传到云存储),灵活性最高。