Estou na versão 3, mas desde que atualizei a única maneira de registrar objetos é stringify primeiro o objeto.
Mas com erros é ainda pior porque não consigo logar o erro de jeito nenhum, preciso usar error.message ou diretamente no console.
Esta é a minha configuração para o ambiente de desenvolvimento:
`` const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf } = formato;
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
})
]
});
Fazendo isso:
logger.error('Error sending contact message:', JSON.stringify(err));
Consegui apenas:
[mylabel] Error sending contact message:
Mas é uma dor de cabeça ter que amarrar tudo, e fazer isso por erros. O que estou fazendo de errado?, porque nas versões anteriores era simples.
+1
@eyp você pode tentar isso?
logger.error('Error sending contact message:%o', {foo: "bar"});
A fonte subjacente está aqui:
https://github.com/winstonjs/logform/blob/master/splat.js
que você pode ver usar util.format
do nó
https://nodejs.org/api/util.html#util_util_format_format_args
então %o
, %O
e %j
fazem o trabalho
%o
funciona como um encanto, eu não sabia que o winston usava os mesmos parâmetros de formatação que o util.format.
Obrigada!
winton 3.1.0
Eu tento isso como escrever aqui:
const debugConsole = new winston.transports.Console({
nível: 'depurar',
formato: winston.format.combine(winston.format.simple()),
handleExceptions: true
})
logger.add(debugConsole)
No código eu uso: logger.debug('%o', req.query)
Eu vejo o objeto json, mas também vejo "%o" antes, log do console abaixo:
depurar: %o {"offset":"73000","count":"3","timestamp":"2018-10-29 15:02:08"}
o que eu faço?
Geralmente %o é chamado por util.format() onde você especifica o objeto que deseja. A partir da saída, parece que você nem precisa de %o porque o objeto está sendo exibido.
Basta usar isso, logger.debug(req.query) e deve funcionar. Ou você pode armazená-lo em uma variável com util.format como este
const queryFormatted = util.format('%o', req.query)
logger.debug(queryFormatted)
@frenzymind Ou tente a solução que foi postada na edição original por @mingchuno.
Basta usar isso, logger.debug(req.query) e deve funcionar
@eponymz Neste caso, há: debug: [object Object] {"timestamp":"2018-10-30 11:14:04"}
const queryFormatted = util.format('%o', req.query)
É obras, mas barulhento.
A saída do segundo é o que você estava querendo? Com isso quero dizer, se você queria a consulta nos logs, ela está aparecendo. Se não, tente a solução alternativa que foi mencionada antes da postagem do mingchuno.
Sim, a segunda maneira funciona como eu quero. Eu vejo dados do objeto json.
Se bem entendi, mingchuno aconselhou usar %o em string, porque winston usa util "sob o capô". Eu tento e funciona, mas %o também é impresso no meu caso. Eu também adiciono o formato splat() ao meu nível de depuração, mas nada muda. Estou sentindo falta de alguma coisa?
Sim, estou vendo %o
pré-anexado à inspeção do objeto. Suponho que seja algum tipo de bug?
Isso é uma escolha de design deliberada? Ele se desvia um pouco do padrão (e demorei uma boa hora para encontrar) em vez de
console.log('Log me plz: ', {'ok': 'logged'});
ter que (winston 3.x) alterar todas as chamadas de log para
logger.info('Log me plz: %o', {'ok':'logged'});
Desculpe, estou certo? Estou confuso...
Sério, isso parece um downgrade. Com o Winston 2, eu poderia substituir todos os console.X
por winston.X
. Por que de repente as tags de formato feio?
Então a correção é anexar o %o
a cada declaração de log que eu quero imprimir um objeto?
Sim!
Não pude aceitar que tenho que usar %o sempre e fiz esta solução simples:
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({})
],
})
Então esse registrador....
logger.info({ hi: 123 })
...transforma para isso no console
info: {
"hi": 123
}
Espero poder ajudar vocês :D É horrível se sempre tivéssemos dois use "%o"
Não pude aceitar que tenho que usar %o sempre e fiz esta solução simples:
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({}) ], })
Então esse registrador....
logger.info({ hi: 123 })
...transforma para isso no console
info: { "hi": 123 }
Espero poder ajudar vocês :D É horrível se sempre tivéssemos dois use "%o"
Legal, mas é estranho, preciso fazer isso para todo o meu nível de logger?
Apenas para informação, é melhor usar
```javascript
typeof info.message === 'objeto'
````
em vez de
```javascript
info.message.constructor === Objeto
````
Evita erros quando a mensagem é nula ou indefinida e os arrays serão exibidos corretamente
(ex: [{oi: "456"}]
Comentários muito úteis
Sério, isso parece um downgrade. Com o Winston 2, eu poderia substituir todos os
console.X
porwinston.X
. Por que de repente as tags de formato feio?