winston
版本?_ 3.2.1winston@2
winston@3
node -v
输出:_ v12.8.1Winston 似乎没有记录异常,它似乎没有正确解析错误对象。
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
transports: [
new winston.transports.File({
filename: `./logs/error-${momentLogger.unix()}.log`,
level: 'error'
}),
new winston.transports.File({
filename: `./logs/debug-${momentLogger.unix()}.log`,
level: 'debug'
}),
new winston.transports.File({
filename: `./logs/combined-${momentLogger.unix()}.log`
}),
new winston.transports.Console({
format: winston.format.simple()
})
]
});
try {
logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
console.log(ex); // Correctly prints
logger.info(ex); // Undefined
logger.debug(ex); // Undefined
logger.error(ex); // Undefined
}
使用 VSCode 调试器进一步调试
// Output
TypeError: Cannot read property '1' of null
at .....google-sheets-scraping-testing.js:188:51
at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, …} // Result of logger.log(ex)
我希望 Winston 记录从 try...catch 块中捕获的错误。 如果我改为传入ex.message
而不是ex
,它会正确输出。 ex
在整个 catch 块中都被定义了,但由于某种原因,Winston 似乎无法解析它。
此外,如果我从 catch 块内return ex
,然后将所有内容包围在另一个 catch 块中,它似乎可以正确输出它。 有关这种不寻常行为的更多信息,请参阅我在 Discord 上发表的支持帖子
此外,我认为此错误还涉及另一个用户在过去一个月中遇到的问题 #1758
我相信这可能是由于应用格式时 winston 记录器和传输之间的行为不一致。 在 winston-transport 中,TransportStream _write 函数的一部分执行以下操作:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
winston/logger.js 中的相关代码看起来像这样:
this.push(this.format.transform(info, this.format.options));
这是该问题的简化重现。
const winston = require('winston');
// First logger uses a format configured on logger
const logger1 = winston.createLogger({
level: 'info',
transports: new winston.transports.Console(),
format: winston.format.simple()
});
// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
level: 'info',
transports: new winston.transports.Console({
format: winston.format.simple()
})
});
logger1.info(new Error('err message')); // logs expected 'err message'
logger2.info(new Error('err message')); // logs 'undefined'
我不清楚应该首选哪种行为。
我想知道当 winston 没有正确记录某些对象并将其打印为[object Object]
而其他对象打印没有问题时,这是否也是同样的情况
@jleverenz
谢谢,很棒的发现! 为我的问题提供了一个简单的解决方法,与https://github.com/winstonjs/winston/issues/1758相同
最有用的评论
我相信这可能是由于应用格式时 winston 记录器和传输之间的行为不一致。 在 winston-transport 中,TransportStream _write 函数的一部分执行以下操作:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
winston/logger.js 中的相关代码看起来像这样:
this.push(this.format.transform(info, this.format.options));
这是该问题的简化重现。
我不清楚应该首选哪种行为。