📜  winston 排除路由 - Javascript (1)

📅  最后修改于: 2023-12-03 15:05:58.079000             🧑  作者: Mango

Winston 排除路由 - JavaScript

Winston 是一个流行的 Node.js 日志记录器,它可以让开发人员以一种简单、灵活的方式来记录应用程序的日志。在一个大型应用程序中,可能需要记录数百万条日志信息。由于这样的大量日志信息,我们可能需要对其中的一些路由进行排除,避免日志把我们的系统磁盘空间耗尽。下面我们将演示如何使用 Winston 排除路由。

安装

在开始排除路由之前,需要先安装 Winston:

npm install winston

同时,为了更好地管理日志,我们还需要安装 winston-daily-rotate-file:

npm install winston-daily-rotate-file
创建 Logger

接下来,我们需要创建一个 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 状态码等。在实际应用中,我们可能需要根据具体情况来选择排除方式。