設置Node.js日志的自動備份策略可以通過多種方式實現,以下是幾種常見的方法:
pm2
和 pm2-logrotate
pm2
是一個流行的 Node.js 進程管理工具,它內置了日志管理功能,包括日志輪轉。
安裝 pm2
:
npm install pm2 -g
啟動你的 Node.js 應用:
pm2 start app.js
配置日志輪轉:
pm2
默認會自動輪轉日志文件,但你可以通過配置文件進一步自定義。
創建一個 ecosystem.config.js
文件:
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: './out.log',
error_file: './err.log',
log_date_format: 'YYYY-MM-DD HH:mm Z',
time: true,
instances: 1,
exec_mode: 'cluster',
max_memory_restart: '1G',
log_rotation: {
period: '1d', // 每天輪轉一次
rotateAfterSize: '10M', // 每個日志文件達到10MB時輪轉
keepFiles: 7, // 保留最近7天的日志文件
},
}],
};
啟動應用并應用配置:
pm2 start ecosystem.config.js
logrotate
工具logrotate
是一個 Linux 系統自帶的日志輪轉工具,可以用來管理各種日志文件。
安裝 logrotate
(如果尚未安裝):
sudo apt-get install logrotate # Debian/Ubuntu
sudo yum install logrotate # CentOS/RHEL
創建 logrotate
配置文件:
在 /etc/logrotate.d/
目錄下創建一個新的配置文件,例如 nodejs-app
:
sudo nano /etc/logrotate.d/nodejs-app
添加以下內容:
/path/to/your/nodejs-app/out.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
/path/to/your/nodejs-app/err.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
測試配置:
sudo logrotate -f /etc/logrotate.d/nodejs-app
winston
和自定義腳本如果你使用 winston
作為日志庫,可以編寫一個自定義腳本來定期備份日志文件。
安裝 winston
:
npm install winston
配置 winston
:
const winston = require('winston');
const fs = require('fs');
const path = require('path');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'out.log' }),
new winston.transports.File({ filename: 'err.log' }),
],
});
// 自定義日志備份腳本
function backupLogs() {
const logDir = path.dirname(require.resolve('your-app-log-file-path'));
const backupDir = path.join(logDir, 'backup');
if (!fs.existsSync(backupDir)) {
fs.mkdirSync(backupDir);
}
const now = new Date().toISOString().replace(/:/g, '-').replace(/\.\d{3}Z$/, 'Z');
const backupFiles = fs.readdirSync(backupDir).filter(file => file.startsWith('out-') || file.startsWith('err-'));
backupFiles.forEach(file => {
fs.unlinkSync(path.join(backupDir, file));
});
fs.renameSync('/path/to/your/nodejs-app/out.log', path.join(backupDir, `out-${now}.log`));
fs.renameSync('/path/to/your/nodejs-app/err.log', path.join(backupDir, `err-${now}.log`));
}
// 每天備份日志
setInterval(backupLogs, 86400000);
啟動你的 Node.js 應用:
node app.js
通過以上方法,你可以根據具體需求選擇合適的策略來自動備份 Node.js 日志文件。