Nodejs logger中间件morgan生成的日志文件不会自动分割吗?
Nodejs logger中间件morgan生成的日志文件不会自动分割吗?
var fs = require(“fs”); // create a write stream (in append mode) var accessLogStream = fs.createWriteStream(’/data/logs/node/access.log’, {flags: ‘a’}) // setup the logger app.use(morgan(‘combined’, {stream: accessLogStream}))
上面代码的结果是所有日志内容都存储在access.log里,不像nginx生成的log自动分割
Nodejs logger中间件morgan生成的日志文件不会自动分割吗?
在使用Node.js的logger中间件morgan
时,你可能会发现日志文件(如access.log
)中的所有日志内容都会被追加到同一个文件中。这与某些其他日志系统(如Nginx)的行为不同,后者会根据时间或其他条件自动分割日志文件。
如何实现自动分割日志文件?
为了实现类似的功能,你可以使用第三方库来管理日志文件的分割。一个常用的库是winston
,它提供了强大的日志记录功能,并且可以与其他库(如morgan
)结合使用。
下面是一个简单的示例,展示如何使用winston
来实现日志文件的自动分割:
-
安装必要的依赖:
npm install morgan winston
-
配置
winston
来分割日志文件:const express = require('express'); const winston = require('winston'); const morgan = require('morgan'); // 创建一个日志目录 const logDir = 'logs'; // 确保日志目录存在 if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir); } // 创建一个每日轮转的日志文件传输器 const dailyRotateFile = new winston.transports.DailyRotateFile({ filename: `${logDir}/access-%DATE%.log`, datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); // 创建一个winston日志记录器 const logger = winston.createLogger({ transports: [ dailyRotateFile ] }); // 设置morgan使用winston作为日志处理器 app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); // 示例路由 app.get('/', (req, res) => { logger.info(`${req.ip} - ${req.method} ${req.originalUrl}`); res.send('Hello World!'); });
在这个示例中,我们使用了winston
的日志轮转功能来创建每日轮转的日志文件。DailyRotateFile
传输器会根据日期自动创建新的日志文件,并将旧的日志文件压缩归档。
解释
DailyRotateFile
:这是一个Winston传输器,用于处理每日轮转的日志文件。filename
:指定日志文件的基本名称。datePattern
:定义日期格式,用于在文件名中插入日期。zippedArchive
:设置是否压缩旧的日志文件。maxSize
和maxFiles
:用于限制单个日志文件的大小以及保留的文件数量。
通过这种方式,你可以轻松地实现类似于Nginx的日志文件自动分割功能,而不需要手动管理日志文件。
Morgan 是一个用于 Node.js 应用的日志中间件,通常与 Express 框架一起使用。它默认不会自动分割日志文件,而是将所有日志写入到指定的文件中。不过,你可以通过外部工具或自定义逻辑来实现日志文件的自动分割。
如果你希望实现日志文件的自动分割(例如按日期分割),可以考虑使用 winston
或 bunyan
等日志库,它们提供了更丰富的功能,包括日志文件的自动分割和轮转。
以下是一个使用 winston
实现日志文件自动分割的例子:
const winston = require('winston');
const { combine, timestamp, printf } = winston.format;
const myFormat = printf(({ level, message, timestamp }) => {
return `${timestamp} ${level}: ${message}`;
});
const logger = winston.createLogger({
format: combine(
timestamp(),
myFormat
),
transports: [
new winston.transports.DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
logger.stream = {
write: function(message, encoding) {
logger.info(message.trim());
}
};
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('combined', { stream: logger.stream }));
在这个例子中,我们使用了 winston
的 DailyRotateFile
运输工具,它可以按天自动创建新的日志文件,并且支持日志文件的压缩和清理。
如果你仍然希望使用 Morgan 和 fs
模块,你可以手动管理日志文件的分割和清理逻辑,但这会增加开发和维护的复杂性。