Ведение журнала узлов без исключения (Winston V3) - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в Уинстоне, и я пытаюсь использовать его для регистрации неперехваченных исключений и затем выхода.Он регистрируется в консоли, но, похоже, не успевает войти в файл перед выходом

Вот пример:

index.js

const express = require('express');
const app = express();
const logger = require('./startup/logging');

process.on('uncaughtException', (ex) => {
    logger.error("Won't be logged in the File");
    process.exit(1);
});

throw new Error("Uncaught");

logging.js

const { createLogger, format, transports } = require('winston');

const logger = createLogger({     
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD hh:mm:ss |'
        }),
        format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
    ),
    transports: [
        new transports.Console({
            format: format.combine(
                format.colorize({
                    // all: true
                }),
                // this is repeated because for some reason colorize() won't work otherwise
                format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)            
            )
        }),
        new transports.File({ filename: './exceptions.log' })
    ]
});

module.exports = logger;

Как уже упоминалось, необработанное исключение регистрируется в консоли, но не в файле.Удаление process.exit(1) решает проблему ведения журнала, но я хочу, чтобы программа завершила работу.

Добавление handleExceptions: true к транспорту файлов вызывает ту же проблему - оно завершается до регистрации исключения.Я предполагаю, что это причина, так как добавление exitOnError: false затем регистрирует исключение.

Это предполагаемое поведение?Это кажется мне странным даже для начинающего.

РЕДАКТИРОВАТЬ:

process.on('uncaughtException', (ex) => {
    logger.log('error', 'Will be logged');
    setTimeout(function(){process.exit(1)}, 1000);
});

Это работает, но, конечно, это не исправление, просто показывает проблему, у меня есть

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Какую версию вы используете?В v2 вы могли бы использовать callback , который выполняется после записи в журнал.

process.on('uncaughtException', (ex) => {
    logger.error("Will be logged in the File", function() {
        process.exit(1);
    });
});

В v3 вы должны делать :

logger.log('info', 'some message');
logger.on('finish', () => process.exit());
logger.end();
0 голосов
/ 27 ноября 2018

Хорошее прочтение проблемы, охватывающей 2013 г. до настоящего времени.

https://github.com/winstonjs/winston/issues/228

Упомянуты различные обходные пути, но не похоже, что это когда-либо будет исправлено,Что раздражает.Вместо этого рассмотрим log4js-узел, который, по-видимому, решил эту проблему.

0 голосов
/ 27 ноября 2018

logging.error, вероятно, является операцией ввода-вывода (асинхронной) и возвращает после вызова:

process.on('uncaughtException', (ex) => {
    logger.error("Won't be logged in the File"); # registers operation with node event loop and continues
    process.exit(1);
});

Документация узла показывает синхронную запись, но я не уверен, как подключитьэто для Уинстона:

process.on('uncaughtException', (err) => {
  fs.writeSync(1, `Caught exception: ${err}\n`);
  process.exit(1)
});
...