2012-02-21 2 views
13

Sto utilizzando Winston in Node.js per la registrazione. So che posso aggiungere metadati individualmente a ciascun messaggio di registro ma esiste un modo per specificare un set predefinito di metadati che verrà aggiunto a ogni messaggio di registro (come il nome dell'app) poiché non desidero specificarlo ogni volta Devo inviare un messaggio di log.Node.js: Winston: Posso aggiungere metadati predefiniti a tutti i messaggi di registro

+0

V'è ora un modo documentato per fare questo, vedere la mia risposta. – DrakaSAN

risposta

16

Non c'è alcun modo incorporato per fare questo, ma si può sicuramente aggiungere voi stessi - ecco come:

In primo luogo, impostare il registratore come si farebbe normalmente. Per esempio:

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

poi sovrascrivere il metodo log() (questo è sempre chiamato dai metodi di livello - logger.foo() chiama in realtà 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); 
} 

Tutto quello che sto facendo qui sopra sta rendendo così quando viene chiamato logger.log(), chiama invece il metodo precedente, che aggiunge i metadati (in questo caso, un oggetto contenente una chiave foo). Quindi chiama il metodo Logger.log di winston dal contesto appropriato.

Il codice di cui sopra sarebbe in un modulo che si crea, in fondo basta esportare il logger:

module.exports = logger;

e importare il modulo logger posto del modulo Winston nelle classi secondarie.

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

Speranza che aiuta!

+0

Grazie Jesse :) –

+1

Nota: questo sovrascriverà qualsiasi metadata specificato nell'istruzione del registro. Puoi usare il carattere di sottolineatura '_.defaults()' per aumentarlo, oppure puoi aggiungere un controllo per args [2] e non sovrascriverlo se esiste per aggirare questo problema. – Jesse

+1

Invece di sovrascrivere gli argomenti, basta aggiungerli: logger.log = function() { var args = argomenti; if (args [2]) { args [2] .foo = "bar" } winston.Logger.prototype.log.apply (this, args); } – harryBundles

3

Un'altra opzione con una produzione più come log4j (s):

C'è un (attualmente non documentato) 'etichetta' struttura nel trasporto Console che aggiungere un'etichetta all'uscita (json o linea):

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; 
}; 

E negli altri moduli richiedono così:

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

uscita Esempio:

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

Ho trovato un modo migliore utilizzando util-extend in base a ciò che ho letto su this blog. Aggiungerà i dati in tutti i casi, che ho trovato utile per la cattura di logger.info vs logger.log ("informazioni", messaggio) e non sovrascriverò gli altri argomenti.

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); 
}; 

Viene emesso nella console e nei registri.

28

Per Winston v2 (vedi commenti)

Ora c'è rewriters che sono il modo documentato e ufficiale per fare questo:

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

    return meta; 
}); 

aggiungerà una proprietà app ad ogni metadati andare throught questo logger.
Si può anche dichiarare quando la costruzione del logger:

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

questa risposta è un modo più pertinente e ufficiale. – shankshera

+0

Dovrebbe essere la risposta corretta –

+0

winston v3 sembra rimuovere la possibilità di mutare i metadati. Ciò significa che @Jesse è la soluzione preferita per winston v3 e + se si desidera aggiungere metadati. Se il log di output è una stringa e non JSON, un formato personalizzato può eseguire il lavoro (cf github.com/winstonjs/winston/issues/1140) –