设置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 日志文件。