2013-12-10 5 views
7

Die Winston Dokumentation hat einen Abschnitt über streaming logs die sagt:Wie funktionieren die Protokollströme von Winston?

Streaming ermöglicht es Ihnen, Ihre Protokolle zurück von dem gewählten Transport zu streamen.

und gibt das folgende Codebeispiel:

// 
// Start at the end. 
// 
winston.stream({ start: -1 }).on('log', function(log) { 
    console.log(log); 
}); 

dieser Meine Lesart ist, dass jede Nachricht neues Protokoll wäre auf der Konsole hinzugefügt. Die Konfiguration {start: -1} weist den Stream an, am Ende der Datei zu beginnen, sodass nur neue Protokolleinträge ausgegeben werden. Ich erwarte, dass das folgende Node-Skript dazu führen würde, dass jede vorhandene Zeile der test.log-Datei an die Konsole ausgegeben wird und anschließend alle 500ms ein neues Objekt ausgegeben wird.

var winston = require('winston'); 
winston.add(winston.transports.File, { 
    filename: 'test.log' 
}); 
winston.remove(winston.transports.Console); 
winston.stream().on('log', function(log) { 
    console.log(log); 
}); 

setInterval(function(){ 
    winston.log('info', 'help'); 
}, 500); 

ich erwarten würde so etwas wie die folgende Ausgabe zu sehen:

{"level":"info","message":"help","timestamp":"2013-12-10T05:55:15.806Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.307Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.809Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:17.309Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:56:48.316Z"} 

tatsächlich ist, was geschieht, dass die Protokollierung mit dem File Transport (die Datei erhält einen all 500ms neuen Protokolleintrag) wie erwartet funktioniert aber es gibt keine Ausgabe auf der Konsole. Die Zeile wird nie aufgerufen.

Habe ich etwas offensichtlich übersehen oder den Zweck von Winstons Protokollströmen missverstanden?

+0

vielleicht verwenden sie das konventionelle "Daten" -Ereignis? – bevacqua

+0

Ich hatte das gleiche Problem, und ich vermute, dass es nicht mit Datei- oder Konsolentransporten funktioniert, da dies die beiden sind, die ich ausprobiert habe, und der Rückruf wird nie aufgerufen. @ Nico, Dieser Code ist direkt aus der README von Winston und im Code: heraus.emittieren ('log', log); Das Problem ist, dass nichts, was ich versucht habe, scheint dies zu arbeiten :( –

+1

Danke für die Bestätigung meiner Verdächtigungen @RobinDuckett. Ich würde dies als ein Fehler ablegen, aber Winston sieht mehr oder weniger tot: https: // github. com/flatiron/winston/issues/294 Müsste abzweigen – drzax

Antwort

9

Ich habe die gleiche Art von Bugg erlebt, die Sie beschreiben. Meine Schlussfolgerung ist, dass die Standard-Logger var winston = require('winston') nicht mit den Funktionen query, stream arbeiten noch ist ein EventEmitter, so dass Sie winston.on('logging', function() {...}) verwenden können.

Die Lösung, die Sie verwenden müssen, ist Ihre eigene Logger wie so zu instanziiert:

var logger = new (winston.Logger)({ 
    transports: [ 
     new (winston.transports.Console)({ level: 'info' }), 
     new (winston.transports.File)({ filename: 'app.log' }) 
    ] 
    }); 

und dann tun Sie einige Protokollierung:

setInterval(function(){ 
    logger.log('info', 'logging some stuff..'); 
    }, 500); 

dann können Sie den Stream bereits angemeldet Einträge mit Hilfe stream:

logger.stream().on('log', function(log) { 
    console.log('>>> ', log); 
    }); 

ich glaube, Sie die stream falsch verstanden Funktion, da es keine Protokolleinträge im laufenden Betrieb streamt, sondern nur alle Einträge streamt, die Sie bereits protokolliert haben. Um ein Ereignis zu Ihrem Logger anschließen Sie das ‚Logging‘ Ereignis auf dem Logger-Objekt verwenden können:

logger.on('logging', function (transport, level, msg, meta) { 
    // [msg] and [meta] have now been logged at [level] to [transport] 
    console.log("[%s] and [%s] have now been logged at [%s] to [%s]", 
       msg, JSON.stringify(meta), level, transport.name); 
    }); 

Ich weiß nicht, warum dies nicht durch die Standard-Logger unterstützt und wie ich schon sagte am Anfang Dieser Post bekomme ich Fehler innerhalb der Async-Bibliothek (Abhängigkeit zu Winston) bei der Verwendung der query oder stream Funktionen mit dem Standard-Logger.

+0

So ist es wie eine zentrale Post-Processing-Stelle für Protokolle? –

Verwandte Themen