如何将 Nextjs 控制台中可见的未捕获错误记录到 (winston) 记录器?

问题描述 投票:0回答:1

所以我尝试使用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()],
});

logging next.js server winston
1个回答
0
投票

使用 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());
});
© www.soinside.com 2019 - 2024. All rights reserved.