Я использую версию 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:
Но это заноза в заднице, когда приходится все упорядочивать, и делать это для ошибок. Что я делаю не так?, потому что в предыдущих версиях это было просто.
+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"}]
Самый полезный комментарий
Серьезно, это похоже на понижение. В Winston 2 я мог просто заменить все
console.X
наwinston.X
. С чего вдруг теги уродливого формата?