【问题标题】: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'

【问题讨论】:

    标签: javascript node.js winston


    【解决方案1】:

    logException 是Transport 的方法,而不是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));
        

        【讨论】:

        【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 2010-11-08
          • 1970-01-01
          • 2014-05-31
          • 2020-10-26
          • 1970-01-01
          • 2010-09-06
          • 2011-11-25
          • 1970-01-01
          • 2011-09-08
          相关资源
          最近更新 更多