nodejs node logger javascript arrays node.js logging winston

javascript - nodejs logger



¿Cómo registrar objetos y matrices de JavaScript en winston como la consola.log? (5)

Estaba buscando los mejores sistemas de registro de nodos: npmlog , log4js , bunyan y winston y decidí usar winston para tener la mayoría de las descargas mensuales de npm .

Lo que quiero configurar es un registrador personalizado que podré usar en el entorno de desarrollo con logger.debug(...) que no registrará nada en el entorno de producción. Esto me ayudará, así que cuando esté en un entorno de desarrollo, no necesitaré escribir nada ya que veré todos los resultados.

Esto es lo que tengo ahora:

var level = ''debug''; if (process.env.NODE_ENV !== ''development''){ level = ''production''; // this will never be logged! } var logger = new winston.Logger({ transports: [ // some other loggings new winston.transports.Console({ name: ''debug-console'', level: level, prettyPrint: true, handleExceptions: true, json: false, colorize: true }) ], exitOnError: false // don''t crush no error });

El problema ocurre cuando estoy intentando registrar un Object JavaScript o una Array Javascript. Con Object , necesito hacer toJSON() , y para Array necesito primero JSON.stringify() y luego JSON.parse() .

No es bueno escribir todo el tiempo este método, solo para registrar algo que quiero. Además, ni siquiera es amigable con los recursos, porque los métodos de formateo deben ejecutarse antes de que logger.debug() dé cuenta de que está en producción y que no debería registrarlo en primer lugar (básicamente, está evaluando argumentos antes de llamar a la función) . Simplemente me gusta la forma antigua console.log console.log() registra los objetos y matrices de JavaScript.

Ahora, mientras escribo esta pregunta, descubrí que hay una manera de describir un formato personalizado para cada objeto de transports Winston. ¿Es esa la forma de hacerlo, o hay alguna otra manera?


Como Leo ya señaló en su answer , Winston utiliza la interpolación de cadenas proporcionada por util.format :

const winston = require("winston"); const logger = new winston.Logger({ transports: [ // some other loggings new winston.transports.Console({ name: "debug-console", level: process.env.LOGLEVEL || "info", prettyPrint: true, handleExceptions: true, json: false, colorize: true }) ], exitOnError: false // don''t crush no error }); const nestedObj = { foo: { bar: { baz: "example" } } }; const myString = "foo"; logger.log("info", "my nested object: %j. My string: %s", nestedObj, myString);

Al llamar a logger.log , puede definir marcadores de posición que serán reemplazados apropiadamente. %j será reemplazado por el equivalente de JSON.stringify(nestedObj)


Mi recomendación es que escriba su propia abstracción sobre Winston que tenga un método conveniente para imprimir sus objetos para depurar.

También puede consultar esta respuesta para obtener una pista de cómo podría desarrollarse el método.

https://.com/a/12620543/2211743


Use la función util.format Node.js util.format para convertir sus objetos en cadenas de la misma manera que la console.log .


intente cambiar el parámetro prettyPrint a

prettyPrint: function ( object ){ return JSON.stringify(object); }