Winston: В 3.0.0 я не могу регистрировать объекты без использования JSON.stringify

Созданный на 22 февр. 2018  ·  18Комментарии  ·  Источник: winstonjs/winston

Я использую версию 3, но, поскольку я обновил ее, единственный способ регистрировать объекты — это сначала преобразовать объект в строку.
А вот с ошибками еще хуже, потому что я вообще не могу логировать ошибку, мне нужно использовать error.message или напрямую консоль.

Это моя конфигурация для среды разработки:

`` const { createLogger, format, transports } = require('winston');
const { комбинировать, отметка времени, метка, printf } = формат;

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

Делая это:

logger.error('Error sending contact message:', JSON.stringify(err));

Я получил только:

[mylabel] Error sending contact message:

Но это заноза в заднице, когда приходится все упорядочивать, и делать это для ошибок. Что я делаю не так?, потому что в предыдущих версиях это было просто.

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

Серьезно, это похоже на понижение. В Winston 2 я мог просто заменить все console.X на winston.X . С чего вдруг теги уродливого формата?

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

+1

@eyp ты можешь попробовать это?

logger.error('Error sending contact message:%o', {foo: "bar"});

Основной источник здесь:

https://github.com/winstonjs/logform/blob/master/splat.js

который, как вы можете видеть, использует util.format из узла

https://nodejs.org/api/util.html#util_util_format_format_args

поэтому %o , %O и %j выполняют свою работу

%o

работает как шарм, я не знал, что Winston использует те же параметры форматирования, что и util.format.

Спасибо!

Уинстон 3.1.0
Я пробую это, как пишут здесь:
const debugConsole = новый winston.transports.Console({
уровень: «отладка»,
формат: winston.format.combine(winston.format.simple()),
хендлИсцептионс: правда
})
logger.add(debugConsole)

В коде я использую: logger.debug('%o', req.query)
Я вижу объект json, но я также вижу "%o" раньше, журнал консоли ниже:
отладка: %o {"смещение": "73000", "количество": "3", "отметка времени": "2018-10-29 15:02:08"}
что я делаю?

Обычно %o вызывается util.format(), где вы указываете нужный объект. Из вывода видно, что вам даже не нужен %o, потому что объект отображается.

Просто используйте вместо этого logger.debug(req.query), и он должен работать. Или вы можете сохранить его в переменной с util.format, как это
const queryFormatted = util.format('%o', req.query)
logger.debug(отформатированный запросом)

@frenzymind Или попробуйте обходной путь, который был опубликован в исходной проблеме @mingchuno.

Просто используйте вместо этого logger.debug(req.query) и он должен работать

@eponymz В этом случае есть: debug: [object Object] {"timestamp": "2018-10-30 11:14:04"}

const queryFormatted = util.format('%o', req.query)

Работает, но шумно.

Является ли результат второго тем, что вы хотели? Под этим я подразумеваю, что если вы хотите, чтобы запрос в журналах отображался. Если нет, попробуйте обходной путь, о котором упоминалось до публикации mingchuno.

Да, второй способ работает так, как я хочу. Я вижу данные объекта json.
Если я правильно понимаю, mingchuno посоветовал использовать %o в строке, потому что Winston использует util «под капотом». Я пробовал, и это работает, но в моем случае также печатается %o. Я также добавляю формат splat() на свой уровень отладки, но ничего не меняется. Я что-то пропустил?

Да, я вижу %o перед проверкой объекта. Я полагаю, это какой-то баг?

Это осознанный выбор дизайна? Он немного отличается от стандарта (и мне понадобился час, чтобы его найти) вместо

console.log('Log me plz: ', {'ok': 'logged'});

необходимость (winston 3.x) изменить все вызовы ведения журнала на

logger.info('Log me plz: %o', {'ok':'logged'});

Извините, я прав? Я смущен...

Серьезно, это похоже на понижение. В Winston 2 я мог просто заменить все console.X на winston.X . С чего вдруг теги уродливого формата?

Итак, исправление состоит в том, чтобы добавить %o к каждому оператору регистрации, который я хочу распечатать?

Да!

Не мог смириться с тем, что всегда должен использовать %o, и сделал это простое решение:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Итак, регистратор....

  logger.info({ hi: 123 })

... преобразуется в это в консоли

info: {
    "hi": 123
}

Надеюсь, я смогу помочь вам, ребята :D Просто ужасно, если бы у нас всегда было два использования "%o"

Не мог смириться с тем, что всегда должен использовать %o, и сделал это простое решение:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Итак, регистратор....

  logger.info({ hi: 123 })

... преобразуется в это в консоли

info: {
    "hi": 123
}

Надеюсь, я смогу помочь вам, ребята :D Просто ужасно, если бы у нас всегда было два использования "%o"

Хороший, но странный, мне нужно делать это для всего моего уровня логгера?

Просто для информации, лучше использовать
```javascript
typeof info.message === 'объект'
````
вместо

```javascript
info.message.constructor === Объект
````
Это позволяет избежать ошибок, когда сообщение является нулевым или неопределенным, и массивы будут отображаться правильно.
(пример: [{привет: "456"}]

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