所以我尝试使用winston 记录器记录我的应用程序中发生的错误。当服务器端或客户端发生错误时,一切都运行顺利(我将日志发送到服务器来记录它们)。但它在我发现错误的情况下起作用。
但是在某些情况下会发生错误,因为某些地方未定义某些内容,或者我没有在某个地方捕获错误。我怎样才能捕捉到这个错误?通常,在 Nextjs 控制台中,我描述了一个完整的错误,包含错误消息和堆栈,但在 Datadog 中,它被记录为几行普通文本(甚至不是错误)。
当错误发生并且它显示在控制台中时,我想将其报告给我的记录器(winston)作为对象。但我不知道如何以及在哪里拦截这个错误。
我在应用程序中有 ErrorBoundry,但错误并不像 Nextjs 控制台中的错误那么精确。我确实有 _error 文件,但一切都是“未定义”(错误和资源)。这就是我的温斯顿配置:
const logger = createLogger({
level: "silly",
format: format.json(),
handleExceptions: true,
transports: [new transports.Console({ handleExceptions: true, handleRejections: true })],
exceptionHandlers: [new transports.Console()],
});
使用 process.on('uncaughtException') 和 process.on('unhandledRejection') 事件监听器。它们允许您捕获应用程序未捕获的错误。这基本上是记录发生的错误。
这里是修改后的代码:
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'silly',
format: format.json(),
handleExceptions: true,
transports: [
new transports.Console({ handleExceptions: true, handleRejections: true }),
],
exceptionHandlers: [
new transports.Console(),
],
});
// Log uncaught exceptions and exit the process
process.on('uncaughtException', (error) => {
logger.error('Uncaught Exception:', { error, stack: error.stack });
logger.transports.forEach((transport) => transport.close());
process.exit(1);
});
// Log unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection:', { reason, stack: reason.stack });
});
// Dispose of transports on process exit to ensure logs are saved
process.on('exit', () => {
logger.transports.forEach((transport) => transport.close());
});