2012-02-21 11 views
13

Estoy usando Winston en Node.js para el registro. Sé que puedo agregar metadatos individualmente a cada mensaje de registro, pero ¿hay alguna 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.Node.js: Winston: ¿Puedo agregar metadatos predeterminados a todos los mensajes de registro

+0

Ahora hay una manera documentada para hacer esto, ver mi respuesta. – DrakaSAN

Respuesta

16

No hay manera integrada para hacer esto, pero definitivamente se puede añadir usted mismo - He aquí cómo:

En primer lugar, configurar el registrador de la forma habitual. Por ejemplo:

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

A continuación, reemplazar el método log() (esto siempre es llamado por los métodos de nivel - logger.foo() llamadas realidad 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 estoy haciendo está por encima de lo que es tan cuando se llama al 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 apropiado.

El código anterior sería en un módulo se crea, en la parte inferior acaba de exportar el registrador:

module.exports = logger;

e importar el módulo registrador lugar del módulo de Winston en sus subclases.

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

Espero que ayude!

+0

Gracias Jesse :) –

+1

Nota: esto sobrescribirá los metadatos que especifique en la declaración de registro. Puede usar los subrayados '_.defaults()' para aumentarlo, o puede agregar un cheque para args [2] y no sobrescribirlo si existe para evitar esto. – Jesse

+1

En lugar de sobrescribir los argumentos, simplemente añádalos: logger.log = function() { var args = arguments; if (args [2]) { args [2] .foo = "bar" } winston.Logger.prototype.log.apply (this, args); } – harryBundles

3

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

Hay una (actualmente indocumentado) Propiedad 'etiqueta' 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 requieren de esta manera:

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

Ejemplo de salida:

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

He encontrado una mejor manera de usar util-extend en base a lo que leo en this blog. Anexará los datos en todos los casos, que encontré útiles 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 sus registros.

28

Para Winston v2 (ver comentarios)

No es ahora rewriters que son la forma documentada y oficial para hacer esto:

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

    return meta; 
}); 

a añadir una propiedad app a todos los metadatos ir throught este registrador.
También puede declarar que la hora de construir el registrador:

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

esta respuesta es una forma más relevante y oficial. – shankshera

+0

Debería ser la respuesta correcta –

+0

winston v3 parece eliminar la posibilidad de mutar los metadatos. Significa que @Jesse es la solución preferida para winston v3 y + si desea agregar metadatos. Si el registro de salida es una cadena y no JSON, un formato personalizado puede hacer el trabajo (cf github.com/winstonjs/winston/issues/1140) –

Cuestiones relacionadas