tutorial nodejs node logger log example custom node.js flatiron.js

nodejs - Node.js: Winston: ¿Puedo agregar metadatos predeterminados a todos los mensajes de registro?



winston node js tutorial (5)

Estoy usando Winston en Node.js para el registro. Sé que puedo agregar metadatos individualmente a cada mensaje de registro, pero hay una manera de especificar un conjunto predeterminado de metadatos que se agregarán a cada mensaje de registro (como el nombre de la aplicación) ya que no quiero especificarlo cada vez Necesito enviar un mensaje de registro.


He encontrado una mejor manera de usar util-extend función de lo que leí en este blog . Agregará los datos en todos los casos, lo que encontré útil para capturar logger.info vs logger.log ("información", mensaje) y no sobrescribirá sus otros argumentos.

logger.log = function(){ var args = arguments; var level = args[0]; var newArgs = { foo: "bar", baz: "abc" }; var originalMeta = args[2] || {}; args[2] = extend(originalMeta, newArgs); winston.Logger.prototype.log.apply(this,args); };

Saldrá en la consola y en tus logs.


No hay una forma integrada de hacer esto, pero definitivamente puede agregarlo usted mismo: así es como:

Primero, configure su registrador como lo haría normalmente. Por ejemplo:

var logger = new (winston.Logger)({ "exitOnError" : true, "transports" : [ new (winston.transports.Console)({ "colorize" : true, "level" : "silly", "silent" : false, "handleExceptions" : false }), ] });

Luego invalide el método log () (esto siempre es llamado por los métodos de nivel - logger.foo() realidad llama a logger.log(''foo'') .)

logger.log = function(){ var args = arguments; if(args[2]) args[3] = args[2]; args[2] = { "foo" : "bar" } winston.Logger.prototype.log.apply(this,args); }

Todo lo que hago arriba es hacerlo así que cuando se llama a logger.log() , en su lugar llama al método anterior, que agrega los metadatos (en este caso, un objeto que contiene una clave foo ). Luego llama al método Logger.log de winston desde el contexto adecuado.

El código anterior estaría en un módulo que cree, en la parte inferior simplemente exporte el registrador:

module.exports = logger;

e importe el módulo de registrador en lugar del módulo de winston en sus subclases.

var logger = require(''./logger.js'');

¡Espero que ayude!


Otra opción con una salida más como log4j (s):

Hay una propiedad de "etiqueta" (actualmente no documentada) en el transporte de la Consola que agregará una etiqueta a la salida (json o línea):

var _ = require(''lodash''); var winston = require(''winston''); var path = require(''path''); var baseDir = path.resolve(__dirname, ''..''); // SETUP WINSTON LOGGER var container = new winston.Container(); container.add("exception", { console: { handleExceptions: true, timestamp: true, label: "EXCEPTION", colorize: true } }); container.get("exception").exitOnError = false; var keys = []; module.exports = function(filename) { var label = path.relative(baseDir, filename); if (!_.contains(keys, label)) { container.add(label, { console: { handleExceptions: false, level: ''debug'', timestamp: true, label: label, colorize: true } }); keys.push(label); } var logger = container.get(label); logger.exitOnError = false; return logger; };

Y en los otros módulos lo requieren así:

var logger = require(''./logger'')(__filename);

Ejemplo de salida:

2014-07-23T07:05:27.770Z - info: [config/config.js] .......


Para Winston v3:

const addAppNameFormat = winston.format(info => { info.appName = "My Program"; return info; }); const logger = winston.createLogger({ format: winston.format.combine( addAppNameFormat(), winston.format.json() ), transports: [new winston.transports.Console()] }); logger.warn(''Danger Will Robinson!''); // {"message":"Danger Will Robinson!","level":"warn","appName":"My Program"}

Consulte: https://github.com/winstonjs/winston/blob/HEAD/UPGRADE-3.0.md#migrating-filters-and-rewriters-to-formats-in-winston3


Para Winston v2 (ver comentarios)

Ahora hay rewriters que son la forma documentada y oficial de hacer esto:

logger.rewriters.push(function(level, msg, meta) { meta.app = ''myApp''; return meta; });

Agregará una app propiedad a todos los metadatos que pasan por este registrador.
También puedes declararlo al construir el registrador:

new (winston.Logger)({ level: config.log[file].level, rewriters: [ (level, msg, meta) => { meta.app = ''myApp''; return meta; } ], transports: [ /*your transports*/ ] });