如何记录“捕获的”异常?

Posted

技术标签:

【中文标题】如何记录“捕获的”异常?【英文标题】:How to log "catched" exceptions? 【发布时间】:2013-05-02 01:46:43 【问题描述】:

当winston 处理未捕获的异常时,它会打印出有关未捕获异常的良好信息。如何对“捕获的异常”执行相同操作?

if (err) 
 // winston. log the catched exception

我查看了来源,似乎有一个logException method,但我不知道如何使用它。

var logger = new winston.Logger(
  transports: [new winston.transports.Console(handleExceptions: true)]
)
var err = new Error('test error.')
logger.logException(err.message) //no method 'logException'

【问题讨论】:

【参考方案1】:

logExceptionTransport 的方法,而不是Logger 类的方法。你需要的是一个error 方法:

var winston = require('winston');
var logger = new winston.Logger(
  transports: [new winston.transports.Console(handleExceptions: true)]
)
var err = new Error('test error.');
logger.error(err.message);

https://github.com/flatiron/winston#using-logging-levels

【讨论】:

【参考方案2】:

您可以将捕获的异常发送回进程,winston.Logger 将捕获错误。示例:

process.emit('uncaughtException', err);

【讨论】:

【参考方案3】:
var winston = require('winston');
var err = new Error('test error.');
winston.error(winston.exception.getAllInfo(err));

【讨论】:

也许这是来自旧版本的winston,但没有这样的API。 github.com/winstonjs/winston【参考方案4】:

使用logform:

const  format  = require('logform');
const  errors  = format;

const errorsFormat = errors( stack: true )

const info = errorsFormat.transform(new Error('Oh no!'));

console.log(info);
// Error: Oh no!
//     at repl:1:13
//     at ContextifyScript.Script.runInThisContext (vm.js:50:33)
//     at REPLServer.defaultEval (repl.js:240:29)
//     at bound (domain.js:301:14)
//     at REPLServer.runBound [as eval] (domain.js:314:12)
//     at REPLServer.onLine (repl.js:468:10)
//     at emitOne (events.js:121:20)
//     at REPLServer.emit (events.js:211:7)
//     at REPLServer.Interface._onLine (readline.js:282:10)
//     at REPLServer.Interface._line (readline.js:631:8)

或者使用winston.format.errors( stack: true ):

import winston from 'winston';

const logger = winston.createLogger(
  level: 'info',
  format: winston.format.combine(
    winston.format.errors( stack: true ),
    winston.format.json(),
    winston.format.prettyPrint(),
  ),
  defaultMeta:  service: 'user-service' ,
  transports: [
    new winston.transports.File(
      filename: 'log/combined.log',
      options:  flags: 'w' ,
    ),
  ],
);

export default logger;

【讨论】:

以上是关于如何记录“捕获的”异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止哨兵捕获某些未捕获的异常和记录消息的事件?

Crashlytics iOS - 记录捕获的异常

winform 记录全局异常捕获

如何使用记录器打印异常?

捕获 iframe 异常 [重复]

elmah 是不是也处理捕获的异常