2012-02-21 14 views
13

Używam Winston w Node.js do rejestrowania. Wiem, że mogę dodawać metadane indywidualnie do każdej wiadomości dziennika, ale czy istnieje sposób na określenie domyślnego zestawu metadanych, które będą dodawane do każdej wiadomości dziennika (takiej jak nazwa aplikacji), ponieważ nie chcę jej określać za każdym razem Muszę wysłać wiadomość dziennika.Node.js: Winston: Czy mogę dodać domyślne dane meta do wszystkich komunikatów dziennika

+0

Jest teraz udokumentowany sposób, aby to zrobić, zobacz moją odpowiedź. – DrakaSAN

Odpowiedz

16

Nie ma wbudowanego sposób to zrobić, ale na pewno można dodać go samodzielnie - oto jak:

Najpierw skonfigurować rejestrator jak zwykle. Na przykład:

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

Następnie zastąpić metodę log() (jest to zawsze nazywane metodami szczebla - logger.foo() faktycznie nazywa 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); 
} 

Wszystko robię powyżej czyni go tak po wywołaniu logger.log() zamiast tego wywołuje powyższą metodę, która dodaje metadane (w tym przypadku obiekt zawierający klucz foo). Następnie wywołuje metodę Logger.log Winstona z właściwego kontekstu.

Powyższy kod będzie w module utworzonym, na dole po prostu wyeksportować rejestratora:

module.exports = logger;

i zaimportować moduł rejestratora zamiast modułu winston w klasach podrzędnych.

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

nadzieję, że pomoże!

+0

Thanks Jesse :) –

+1

Uwaga: spowoduje to zastąpienie dowolnych metadanych określonych w wyciągu dziennika. Możesz użyć znaku podkreślenia '_.defaults()', aby go poprawić, lub możesz dodać sprawdzanie argumentów [2] i nie zastępować go, jeśli istnieje, aby ominąć to. – Jesse

+1

Zamiast nadpisywać argumenty, wystarczy je dołączyć: logger.log = function() { var args = arguments; if (args [2]) { args [2] .foo = "bar" } winston.Logger.prototype.log.apply (this, args); } – harryBundles

3

Inną opcją o mocy bardziej jak log4j (ów):

Jest (obecnie nieudokumentowane) „etykieta” mienie w transporcie konsola która doda wytwórnię do wyjścia (json lub linia):

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

oraz w innych modułów wymaga tak:

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

Przykład Wydajność:

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

Znalazłem lepszy sposób korzystania z util-extend na podstawie tego, co przeczytałem na this blog. Będzie on dołączał dane we wszystkich przypadkach, które uważałem za przydatne do przechwytywania logger.info vs logger.log ("info", wiadomość) i nie zastąpią innych argumentów.

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

Wypisze w konsoli i dziennikach.

28

Winston v2 (patrz komentarze)

Obecnie rewriters, które są udokumentowane i oficjalny sposób, aby to zrobić:

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

    return meta; 
}); 

doda własność app aby każdy metadanych będzie throught to rejestrator.
Można również zadeklarować przy budowie rejestratora:

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

ta odpowiedź jest bardziej trafna i oficjalna. – shankshera

+0

Powinna być poprawna odpowiedź –

+0

Winston v3 wydaje się usuwać możliwość mutacji metadanych. Oznacza to, że @Jesse jest preferowanym rozwiązaniem dla winston v3 & +, jeśli chcesz dodać metadane. Jeśli logiem wyjściowym jest ciąg znaków, a nie JSON, niestandardowy format może wykonać zadanie (cf github.com/winstonjs/winston/issues/1140) –

Powiązane problemy