Winston: Winston не регистрирует / не анализирует обнаруженную ошибку из-за исключения

Созданный на 4 мар. 2020  ·  3Комментарии  ·  Источник: winstonjs/winston

Расскажите, пожалуйста, о вашей среде:

  • _ winston версия? _ 3.2.1

    • [] winston@2

    • [x] winston@3

  • _ node -v выходы: _ v12.8.1
  • _Операционная система? _ (Windows, macOS или Linux) Windows
  • _Language? _ (Все | TypeScript XX | ES6 / 7 | ES5 | Dart) ES6

В чем проблема?

Уинстон, похоже, не регистрирует исключения, похоже, он не анализирует объект ошибки должным образом.

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
    transports: [
        new winston.transports.File({
            filename: `./logs/error-${momentLogger.unix()}.log`,
            level: 'error'
        }),
        new winston.transports.File({
            filename: `./logs/debug-${momentLogger.unix()}.log`,
            level: 'debug'
        }),
        new winston.transports.File({
            filename: `./logs/combined-${momentLogger.unix()}.log`
        }),
        new winston.transports.Console({
            format: winston.format.simple()
        })
    ]
});

try {
    logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
    console.log(ex); // Correctly prints
    logger.info(ex); // Undefined
    logger.debug(ex); // Undefined
    logger.error(ex); // Undefined
}

Дальнейшая отладка с помощью отладчика VSCode

// Output
TypeError: Cannot read property '1' of null
    at .....google-sheets-scraping-testing.js:188:51
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}

// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, …}  // Result of logger.log(ex)

Что вы ожидаете вместо этого?

Я ожидаю, что Уинстон зарегистрирует обнаруженную ошибку из блока try ... catch. Если я вместо этого передам ex.message вместо ex , он правильно выведет. ex определяется во всем блоке catch, но по какой-то причине Уинстон не может его проанализировать.

Другая информация

Более того, если я return ex из блока catch, а затем окружаю все в другом блоке catch, кажется, что он правильно выводит его. Подробнее об этом необычном поведении см. Здесь суть сообщения службы поддержки, которое я сделал на Discord, прежде чем я понял, что это ошибка Winston.

Кроме того, я думаю, что эта ошибка также влечет за собой проблему, которая возникла у другого пользователя за последний месяц по адресу # 1758.

Самый полезный комментарий

Я считаю, что это может быть связано с несовместимым поведением логгеров Winston и транспортов при применении форматов. В winston-transport часть функции TransportStream _write делает следующее:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

Соответствующий код в winston / logger.js выглядит так:

this.push(this.format.transform(info, this.format.options));

Вот упрощенная реплика проблемы.

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

Мне не ясно, какое поведение следует предпочесть.

Все 3 Комментарий

Я считаю, что это может быть связано с несовместимым поведением логгеров Winston и транспортов при применении форматов. В winston-transport часть функции TransportStream _write делает следующее:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

Соответствующий код в winston / logger.js выглядит так:

this.push(this.format.transform(info, this.format.options));

Вот упрощенная реплика проблемы.

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

Мне не ясно, какое поведение следует предпочесть.

Интересно, случается ли это с тем же случаем, когда Winston неправильно регистрирует некоторые объекты и печатает их как [object Object] то время как другие объекты печатаются без проблем.

@jleverenz
Спасибо, отличная находка! Дало простое решение моей проблемы, которое было таким же, как https://github.com/winstonjs/winston/issues/1758

Была ли эта страница полезной?
0 / 5 - 0 рейтинги