在Node.js中配置日志轮转可以通过多种方式实现,以下是几种常见的方法:
Winston 是一个非常流行的Node.js日志库,结合 winston-daily-rotate-file 可以实现日志的每日轮转。
安装依赖:
npm install winston winston-daily-rotate-file 配置 Winston:
const winston = require('winston'); const { createLogger, format, transports } = winston; const DailyRotateFile = require('winston-daily-rotate-file'); const logger = createLogger({ level: 'info', format: format.combine( format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(({ timestamp, level, message }) => { return `${timestamp} ${level}: ${message}`; }) ), transports: [ new DailyRotateFile({ filename: 'logs/application-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }) ] }); module.exports = logger; 使用日志记录器:
const logger = require('./logger'); logger.info('Server is running on port 3000'); 如果你使用的是 Express 框架,可以结合 morgan 和 morgan-body-parser 来实现日志轮转。
安装依赖:
npm install morgan morgan-body-parser 配置 Morgan:
const express = require('express'); const morgan = require('morgan'); const { createLogger, format, transports } = winston; const DailyRotateFile = require('winston-daily-rotate-file'); const app = express(); const logger = createLogger({ level: 'info', format: format.combine( format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(({ timestamp, level, message }) => { return `${timestamp} ${level}: ${message}`; }) ), transports: [ new DailyRotateFile({ filename: 'access-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }) ] }); app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); app.post('/example', (req, res) => { res.send('Example endpoint'); }); app.listen(3000, () => { logger.info('Server is running on port 3000'); }); 如果你使用 PM2 来管理 Node.js 应用,可以利用其内置的日志管理功能来实现日志轮转。
启动应用:
pm2 start app.js --name my-app 配置日志轮转:
pm2 set pm2:log - date - format "YYYY-MM-DD HH:mm:ss" pm2 set pm2:max - size "20M" pm2 set pm2:retain "14d" Linux 自带的 logrotate 工具可以自动处理日志轮转,适用于生产环境。
创建 logrotate 配置文件:
sudo nano /etc/logrotate.d/node-app 添加以下内容:
/var/log/node-app.log { daily rotate 7 compress missingok notifempty copytruncate dateext } 测试 logrotate:
sudo logrotate -f /etc/logrotate.d/node-app const log4js = require('log4js'); log4js.configure({ appenders: { file: { type: 'file', filename: 'app.log', maxLogSize: 10485760, // 10MB backups: 5, // 保留5个备份 compress: true // 压缩备份 } }, categories: { default: { appenders: ['file'], level: 'info' } } }); const logger = log4js.getLogger(); const bunyan = require('bunyan'); const rfs = require('rotating-file-stream'); const stream = rfs.createStream('app.log', { size: '10M', // 每个文件10MB interval: '1d', // 每天轮转 compress: 'gzip', // 压缩旧日志 path: '/path/to/logs' }); const logger = bunyan.createLogger({ name: 'myapp', streams: [{ level: 'info', stream: stream }] });