Winston: No 3.0.0, não consigo registrar objetos sem usar JSON.stringify

Criado em 22 fev. 2018  ·  18Comentários  ·  Fonte: winstonjs/winston

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.

Comentários muito úteis

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?

Todos 18 comentários

+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"}]

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ghost picture ghost  ·  4Comentários

JaehyunLee-B2LiNK picture JaehyunLee-B2LiNK  ·  3Comentários

Infinitay picture Infinitay  ·  3Comentários

Buzut picture Buzut  ·  3Comentários

KingRial picture KingRial  ·  3Comentários