在Debian系統中,Node.js應用的日志備份需結合日志輪轉(控制單個日志文件大小與保留數量)與定期歸檔(將日志轉移至安全存儲)兩種核心手段,以下是具體實施方案:
sudo apt-get update && sudo apt-get install rsync -y
sudo mkdir -p /backup/nodejs_logs
#!/bin/bash
LOG_SRC="/path/to/your/nodejs/logs" # 替換為實際日志目錄
BACKUP_DEST="/backup/nodejs_logs"
DATE=$(date +"%Y%m%d_%H%M%S")
# 創建日期子目錄并同步日志
sudo mkdir -p "$BACKUP_DEST/$DATE"
sudo rsync -av --delete "$LOG_SRC/" "$BACKUP_DEST/$DATE/"
# 可選:壓縮備份目錄減少存儲占用
sudo tar -czvf "$BACKUP_DEST/${DATE}.tar.gz" -C "$BACKUP_DEST" "$DATE"
sudo rm -rf "$BACKUP_DEST/$DATE" # 刪除未壓縮的原始備份
sudo chmod +x /usr/local/bin/backup_nodejs_logs.sh
crontab -e
添加以下內容(每天凌晨2點執行備份):
0 2 * * * /usr/local/bin/backup_nodejs_logs.sh >> /backup/nodejs_logs/backup.log 2>&1
注:
>> /backup/nodejs_logs/backup.log 2>&1會將腳本輸出(包括錯誤信息)追加到備份日志中,便于后續排查問題。
logrotate是Debian系統自帶的日志管理工具,可自動完成日志輪轉、壓縮、刪除等操作,無需額外編寫腳本。
sudo apt-get install logrotate -y
sudo nano /etc/logrotate.d/nodejs
添加以下配置(根據實際需求調整參數):
/path/to/your/nodejs/logs/*.log {
daily # 每天輪轉一次
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(使用gzip)
delaycompress # 延遲壓縮(如不立即壓縮前一天的日志)
missingok # 若日志文件不存在,不報錯
notifempty # 若日志為空,不輪轉
create 0640 root adm # 創建新日志文件,權限0640,屬主root,屬組adm
sharedscripts # 所有日志輪轉完成后執行postrotate腳本
postrotate
/usr/sbin/killall -HUP node # 重啟Node.js進程,重新打開日志文件
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs # 模擬運行(dry run),檢查配置語法
sudo logrotate -f /etc/logrotate.d/nodejs # 強制立即執行輪轉
注:
postrotate腳本中的killall -HUP node用于通知Node.js進程重新打開日志文件,避免因日志文件被輪轉而丟失后續日志。
若需更靈活的日志管理(如按文件大小輪轉、自定義日志格式),可使用Winston日志庫結合winston-daily-rotate-file模塊,在應用代碼中實現日志輪轉。
npm install winston winston-daily-rotate-file --save
const winston = require('winston');
const { format } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');
// 定義日志格式(JSON格式,包含時間戳和錯誤堆棧)
const logFormat = format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.errors({ stack: true }), // 包含錯誤堆棧信息
format.json() // 輸出JSON格式
);
// 配置日志輪轉傳輸器
const transport = new DailyRotateFile({
filename: '/path/to/your/nodejs/logs/application-%DATE%.log', // 日志文件名模板
datePattern: 'YYYY-MM-DD', // 日期模式(按天分割)
zippedArchive: true, // 壓縮舊日志
maxSize: '20m', // 單個日志文件最大20MB
maxFiles: '14d' // 保留最近14天的日志
});
// 創建Winston日志記錄器實例
const logger = winston.createLogger({
level: 'info', // 日志級別(info及以上級別會記錄)
format: logFormat, // 使用定義的格式
transports: [transport] // 添加輪轉傳輸器
});
module.exports = logger;
const logger = require('./logger');
// 示例日志記錄
logger.info('Application started successfully');
logger.error('An error occurred:', new Error('Test error'));
注:Winston的
DailyRotateFile傳輸器會自動處理日志輪轉,無需額外配置系統工具。這種方式適合需要深度定制日志的場景(如多環境、多模塊日志分離)。
為確保備份任務正常運行,需添加監控與告警機制:
使用du命令定期檢查備份目錄占用的磁盤空間,避免備份文件占用過多空間:
du -sh /backup/nodejs_logs/* # 查看各日期備份的大小
sudo apt-get install monit -y
編輯Monit配置文件(/etc/monit/monitrc):
check file logs with path /path/to/your/nodejs/logs/*.log
if size > 100M then alert # 日志文件超過100MB時發送警報
if does not exist then alert # 日志文件丟失時發送警報
check process logrotate with pidfile /var/run/logrotate.pid
start program = "/usr/sbin/logrotate /etc/logrotate.conf"
stop program = "/bin/killall -HUP logrotate"
if failed host 127.0.0.1 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout
啟動Monit服務:
sudo systemctl enable monit && sudo systemctl start monit
注:Monit會在檢測到異常時發送郵件通知(需提前配置郵件服務),幫助及時處理備份失敗或日志溢出問題。
若需集中管理多臺服務器的Node.js日志,可將日志發送至ELK Stack(Elasticsearch + Logstash + Kibana)或Fluentd等集中式日志系統:
通過集中式日志管理,可實現日志的統一存儲、快速檢索與長期歸檔,提升日志管理的效率。
以上策略可根據實際需求組合使用(如基礎備份+應用層輪轉+監控),確保Node.js日志的安全性與可追溯性。