Winston: En 3.0.0 no puedo registrar objetos sin usar JSON.stringify

Creado en 22 feb. 2018  ·  18Comentarios  ·  Fuente: winstonjs/winston

Estoy en la versión 3, pero desde que actualicé, la única forma de registrar objetos es mediante la cadena primero del objeto.
Pero con los errores es aún peor porque no puedo registrar el error en absoluto, necesito usar error.message o directamente la consola.

Esta es mi configuración para el entorno de desarrollo:

`` const { createLogger, formato, transportes } = require('winston');
const { combinar, marca de tiempo, etiqueta, 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
        })
    ]
});

Haciendo esto:

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

Solo tengo:

[mylabel] Error sending contact message:

Pero es un dolor en el culo tener que clasificar todo, y hacerlo por errores. ¿Qué estoy haciendo mal?, porque en versiones anteriores era sencillo.

Comentario más útil

En serio, esto parece una rebaja. Con Winston 2, podría reemplazar todo console.X con winston.X . ¿Por qué de repente las etiquetas de formato feo?

Todos 18 comentarios

+1

@eyp puedes probar esto?

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

La fuente subyacente está aquí:

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

que puedes ver que usa util.format del nodo

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

entonces %o , %O y %j hacen el trabajo

%o

funciona de maravilla, no sabía que winston usaba los mismos parámetros de formato que util.format.

¡Gracias!

winston 3.1.0
Intento esto como escribir aquí:
const debugConsole = new winston.transports.Console({
nivel: 'depuración',
formato: winston.format.combine(winston.format.simple()),
manejarExcepciones: verdadero
})
logger.add(consola de depuración)

En el código que uso: logger.debug('%o', req.query)
Veo el objeto json, pero también veo "%o" antes, registro de la consola a continuación:
depuración: %o {"desplazamiento":"73000","recuento":"3","marca de tiempo":"2018-10-29 15:02:08"}
¿Qué estoy haciendo?

Generalmente %o es llamado por util.format() donde especifica el objeto que desea allí. A partir de la salida, parece que ni siquiera necesita %o porque se muestra el objeto.

Simplemente use esto en su lugar, logger.debug(req.query) y debería funcionar. O puede almacenarlo en una variable con util.format como este
const consultaFormatted = util.format('%o', req.consulta)
registrador.depuración (formato de consulta)

@frenzymind O prueba la solución que @mingchuno publicó en el número original.

Simplemente use esto en su lugar, logger.debug(req.query) y debería funcionar

@eponymz En este caso hay: depuración: [objeto Objeto] {"marca de tiempo":"2018-10-30 11:14:04"}

const consultaFormatted = util.format('%o', req.consulta)

Es obras, pero ruidoso.

¿Es la salida del segundo lo que querías? Con eso quiero decir, si querías la consulta en los registros, ¿se está mostrando? Si no, pruebe la solución alternativa que se mencionó antes de que mingchuno publicara.

Sí, la segunda forma funciona como yo quiero. Veo datos de objetos json.
Si entiendo bien, mingchuno aconsejó usar %o en la cadena, porque winston usa util "debajo del capó". Lo intento y funciona, pero %o también se imprime en mi caso. También agrego el formato splat() a mi nivel de depuración, pero nada cambia. ¿Me estoy perdiendo algo?

Sí, veo %o antes de la inspección del objeto. ¿Supongo que es algún tipo de error?

¿Es esa una elección de diseño deliberada? Se desvía bastante del estándar (y me tomó una buena hora encontrarlo) en lugar de

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

tener que (winston 3.x) cambiar todas las llamadas de registro a

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

Lo siento, ¿estoy en lo cierto? Estoy confundido...

En serio, esto parece una rebaja. Con Winston 2, podría reemplazar todo console.X con winston.X . ¿Por qué de repente las etiquetas de formato feo?

Entonces, ¿la solución es agregar %o a cada declaración de registro que quiero imprimir un objeto?

¡Sí!

No podía aceptar que tengo que usar %o siempre e hice esta solución simple:

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({})
  ],
})

Así que este registrador....

  logger.info({ hi: 123 })

...se transforma a esto en la consola

info: {
    "hi": 123
}

Espero poder ayudarlos :D Simplemente terrible si siempre tuviéramos dos usos "%o"

No podía aceptar que tengo que usar %o siempre e hice esta solución simple:

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({})
  ],
})

Así que este registrador....

  logger.info({ hi: 123 })

...se transforma a esto en la consola

info: {
    "hi": 123
}

Espero poder ayudarlos :D Simplemente terrible si siempre tuviéramos dos usos "%o"

Bonito, pero es raro, ¿tengo que hacerlo para todo mi nivel de registrador?

Solo para información, es mejor usar
```javascript
typeof info.message === 'objeto'
````
en vez de

```javascript
info.mensaje.constructor === Objeto
````
Evita errores cuando el mensaje es nulo o indefinido y las matrices se mostrarán correctamente
(por ejemplo: [{hola: "456"}]

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

bertolo1988 picture bertolo1988  ·  3Comentarios

Infinitay picture Infinitay  ·  3Comentarios

pocesar picture pocesar  ·  3Comentarios

Nepoxx picture Nepoxx  ·  4Comentarios

anks333 picture anks333  ·  3Comentarios