温斯顿不记录未捕获的异常

时间:2018-09-05 11:34:25

标签: node.js express winston

我正在尝试使用Winston将未处理的异常记录到文件和控制台。问题在于它没有记录它们。这是我的设置:

var winston = require('winston');

let file = process.env.APP_TOOL_SET_API_PROJECT+"/logs/app.log";
console.log(process.env.APP_TOOL_SET_API_PROJECT);

// define the custom settings for each transport (file, console)
var options = {
  file: {
    level: 'info',
    filename: file,
    handleExceptions: true,
    json: true,
    maxsize: 5242880, // 5MB
    maxFiles: 5,
    colorize: false,
  },
  console: {
    level: 'debug',
    handleExceptions: false,
    json: true,
    colorize: true,
  },
};

// instantiate a new Winston Logger with the settings defined above
var logger = winston.createLogger({
    format: winston.format.combine(
        //winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
          format: 'YYYY-MM-DD HH:mm:ss'
        }),
        //
        // The simple format outputs
        // `${level}: ${message} ${[Object with everything else]}`
        //
        winston.format.simple(),
        //
        // Alternatively you could use this custom printf format if you
        // want to control where the timestamp comes in your final message.
        // Try replacing `format.simple()` above with this:
        //
        winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
    ),
    transports: [
        new winston.transports.File(options.file),
        new winston.transports.Console(options.console)
    ],
    exceptionHandlers: [
        new winston.transports.File({ filename: process.env.APP_TOOL_SET_API_PROJECT+"/logs/exceptions.log" }),
    ],
    exitOnError: false, // do not exit on handled exceptions
});

// create a stream object with a 'write' function that will be used by `morgan`
logger.stream = {
  write: function(message, encoding) {
    // use the 'info' log level so the output will be picked up by both transports (file and console)
    logger.info(message);
  },
};

module.exports = logger;

要添加更多信息,如果我用setTimer包装了一个抛出的异常,那么它将被正确记录。

setTimeout(() => {
    throw new Error('hello world');
  }, 250);

但这仅适用于用户抛出的异常,必须用setTimeout包装每个抛出确实很丑陋。

对此有什么解决办法吗?

1 个答案:

答案 0 :(得分:1)

好吧,刚发布答案后,我的心理背景线程就吐出了可能的问题。

很明显,我抛出异常(只是测试)还为时过早,而且我没有给Winston足够的时间来正确初始化。

这就是为什么等待setTimer正确记录日志的原因。