我使用带有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
但它没有用,有什么想法吗?
答案 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
对象将具有正确的数据。