在Node.js应用程序中,日志轮转和压缩是重要的维护任务,有助于管理日志文件的大小和数量,同时节省存储空间。以下是一些常用的方法和工具来实现日志轮转与压缩:
1. 使用 winston
和 winston-daily-rotate-file
winston
是一个流行的日志库,结合 winston-daily-rotate-file
可以实现日志的每日轮转。
安装依赖
npm install winston winston-daily-rotate-file
配置示例
const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const transport = new DailyRotateFile({ filename: 'application-%DATE%.log', datePattern: 'YYYY-MM-DD-HH', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ transport ] }); logger.info('Hello, world!');
2. 使用 pino
和 pino-rotate
pino
是一个高性能的日志库,结合 pino-rotate
可以实现日志的轮转。
安装依赖
npm install pino pino-rotate
配置示例
const pino = require('pino'); const rotate = require('pino-rotate'); const logger = pino({ level: 'info' }); rotate({ period: '1d', // 每天轮转一次 path: 'logs/', // 日志文件存放路径 maxsize: '20m', // 单个日志文件最大大小 compress: true // 是否压缩旧日志文件 }); logger.info('Hello, world!');
3. 使用 morgan
和 morgan-body
morgan
是一个HTTP请求日志中间件,结合 morgan-body
可以记录请求体日志,并使用其他工具进行轮转和压缩。
安装依赖
npm install morgan morgan-body
配置示例
const express = require('express'); const morgan = require('morgan'); const morganBody = require('morgan-body'); const fs = require('fs'); const path = require('path'); const { createLogger, format, transports } = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const app = express(); // 创建日志目录 const logDir = path.join(__dirname, 'logs'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir); } // 配置winston日志 const transport = new DailyRotateFile({ filename: path.join(logDir, 'access-%DATE%.log'), datePattern: 'YYYY-MM-DD-HH', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); const logger = createLogger({ level: 'info', format: format.combine( format.timestamp(), format.json() ), transports: [ transport ] }); // 使用morgan记录访问日志 app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); // 使用morgan-body记录请求体日志 app.use(morganBody()); app.get('/', (req, res) => { res.send('Hello, world!'); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
总结
以上方法展示了如何在Node.js应用程序中实现日志轮转和压缩。选择合适的日志库和工具,根据具体需求进行配置,可以有效地管理日志文件,确保应用程序的稳定运行。