📅  最后修改于: 2023-12-03 15:05:58.079000             🧑  作者: Mango
Winston 是一个流行的 Node.js 日志记录器,它可以让开发人员以一种简单、灵活的方式来记录应用程序的日志。在一个大型应用程序中,可能需要记录数百万条日志信息。由于这样的大量日志信息,我们可能需要对其中的一些路由进行排除,避免日志把我们的系统磁盘空间耗尽。下面我们将演示如何使用 Winston 排除路由。
在开始排除路由之前,需要先安装 Winston:
npm install winston
同时,为了更好地管理日志,我们还需要安装 winston-daily-rotate-file:
npm install winston-daily-rotate-file
接下来,我们需要创建一个 Winston Logger 实例,配置日志输出路径以及日志格式。我们建议将该实例全局共享,这样可以方便地在应用程序的各个部分使用 Logger。
const winston = require('winston');
require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
// 配置终端输出
new winston.transports.Console({
format: winston.format.simple(),
}),
// 配置每天一个文件输出
new winston.transports.DailyRotateFile({
filename: './logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
}),
],
});
有了 Logger 实例以后,我们需要决定哪些路由需要排除。在实际应用中,我们可能需要根据路径、HTTP 方法、HTTP 状态码等来进行排除。在这里,我们演示一个根据路径来排除的例子:
const express = require('express');
const app = express();
const excludeRoutes = ['/health', '/metrics'];
app.use((req, res, next) => {
const isExcludeRoute = excludeRoutes.includes(req.path);
req.logger = isExcludeRoute ? null : logger;
next();
});
在这里,我们创建了一个中间件函数,通过检查 req.path
是否在排除列表 excludeRoutes
中来决定是否把 logger
分配给 req.logger
。如果 req.path
在排除列表中,那么 req.logger
就会赋值为 null
,否则就是 logger
实例。
接下来,我们就可以在每个路由中使用 req.logger
对请求进行记录了:
app.get('/', (req, res) => {
const startTime = Date.now();
req.logger && req.logger.info('Request Received', { method: 'GET', path: '/' });
res.send(`Hello World! Response time: ${(Date.now() - startTime) / 1000}s`);
});
在这里,我们检查路由是否被排除,如果没有被排除,那么就记录请求信息。
至此,我们介绍了如何在 Winston 中排除路由。根据这个示例,我们可以修改中间件函数,以支持更多的排除方式,比如 HTTP 方法、HTTP 状态码等。在实际应用中,我们可能需要根据具体情况来选择排除方式。