【问题标题】:node.js express-winston errorLogger skip doesn't worknode.js express-winston errorLogger 跳过不起作用
【发布时间】:2015-10-16 13:12:13
【问题描述】:

我正在使用 node.js 和 express-winston 进行日志记录,就像这样:

var express = require('express');
var app = express();

var winston = require('winston');
var expressWinston = require('express-winston');

var routes = require('./routes/index');

app.use("/", routes);

app.use(
    expressWinston.errorLogger({
        transports: [
            new winston.transports.DailyRotateFile({
                name: 'file',
                datePattern: '_dd-MM-yyyy.log',
                colorize: true,
                json: true,
                filename: './logs/errors/error_log',
                maxsize: 50 * 1024 * 1024,
                maxFiles: 10,
                zippedArchive: true
            }),
            new winston.transports.Console({
                json: true,
                colorize: true
            })
        ],
        skip: function(req, res) {
            return true;
        }
    })
);

请注意,我正在使用跳过函数并返回 true(用于测试目的),以便跳过所有错误日志记录,如下所示:express-winston options

但它不起作用,有什么想法吗?

【问题讨论】:

    标签: node.js express winston


    【解决方案1】:

    在根据README.md发送响应后调用skip函数:

    判断是否跳过记录的函数,默认返回false。 响应已经发送后调用。

    对于您的示例,您希望使用 ignoreRoute 选项,对于您的情况,该选项将是一个返回 true 的函数。

    判断是否跳过记录的函数,默认返回false。在任何后面的中间件之前调用

    app.use(
      expressWinston.errorLogger({
        transports: [
            new winston.transports.DailyRotateFile({
                name: 'file',
                datePattern: '_dd-MM-yyyy.log',
                colorize: true,
                json: true,
                filename: './logs/errors/error_log',
                maxsize: 50 * 1024 * 1024,
                maxFiles: 10,
                zippedArchive: true
            }),
            new winston.transports.Console({
                json: true,
                colorize: true
            })
        ],
              v------------------------------ use `ignoreRoute` instead of `skip`
        ignoreRoute: function(req, res) {
            return true;
        }
      })
    );
    

    【讨论】:

      【解决方案2】:

      您在路由中间件之后注册 Winston 中间件。在执行路由中间件之前必须先注册它。

      正确的实现 -

      const routeWhitelist = [
        "/route/whitelisted",
      ];
      
      app.use(expressWinston.logger({
        ignoreRoute: function (req, res) {
          return routeWhitelist.indexOf(req.path) === -1;
        },
        skip: function (req, res) {
          return res.statusCode == 200;
        },
        winstonInstance: logger
      })
      );
      
      app.use("/", routes);
      
      

      需要注意的指针 -
      ignoreRoute - 在任何后续中间件之前调用。 res 对象会有错误的数据。
      skip - 在响应已经发送后调用。 res 对象将有正确的数据。

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 2013-03-10
        • 2012-05-01
        相关资源
        最近更新 更多