node.js express-winston errorLogger skip不起作用

时间:2015-07-26 07:21:55

标签: node.js express winston

我使用带有express-winston的node.js进行日志记录,例如:

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;
        }
    })
);

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

但它没有用,有什么想法吗?

2 个答案:

答案 0 :(得分: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;
    }
  })
);

答案 1 :(得分:0)

您是在路由中间件之后注册 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 对象将具有正确的数据。