Уинстон не регистрирует неисследованные исключения - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь использовать 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 голосов
/ 05 сентября 2018

Что ж, сразу после публикации ответа мой поток мыслей плюнул на возможную проблему.

Очевидно, я бросил исключение (просто тестирование) слишком рано, и мне не дали Уинстону достаточно времени для правильной инициации.

Вот почему ожидание с setTimer регистрировалось правильно.

...