2013-12-10 16 views
7

La documentazione Winston ha una sezione su streaming logs che dice:Come funzionano gli stream di log di Winston?

Streaming permette lo streaming i log di ritorno dalla vostra scelta trasporto.

e fornisce il seguente esempio di codice:

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

La mia lettura di questo è che ogni nuovo messaggio di log aggiunto sarebbe uscita per la console. La configurazione {start: -1} indica allo stream di avviarsi alla fine del file, quindi vengono visualizzate solo le nuove voci del registro. Prevedo che il seguente script di Nodo provocherebbe che ogni riga esistente del file test.log venga emessa nella console e quindi un nuovo oggetto venga emesso ogni 500 ms da quel momento in poi.

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

mi sarei aspettato di vedere qualcosa di simile al seguente output:

{"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"} 

Che cosa realmente accade è che la registrazione funziona come previsto con il trasporto di file (il file ha una nuova voce di registro ogni 500ms) ma non c'è uscita alla console. La linea console.log(log) non viene mai chiamata.

Ho perso qualcosa di ovvio, o frainteso lo scopo dei flussi di log di Winston?

+0

forse usano l'evento convenzionale "dati"? – bevacqua

+0

Ho avuto lo stesso problema e ho il sospetto che non funzioni con i trasporti File o Console poiché questi sono i due che ho provato e la richiamata non viene mai chiamata. @Nico, questo codice è direttamente dal README di winston e nel codice: out.emettere ('log', log); Il problema è che niente di ciò che ho provato sembra funzionare :( –

+1

Grazie per aver confermato i miei sospetti @RobinDuckett. Lo avrei archiviato come un bug, ma Winston sembra più o meno morto: https: // github. com/flatiron/winston/issues/294 Potrebbe essere necessario fork. – drzax

risposta

9

Ho sperimentato lo stesso tipo di bugg che stai descrivendo. La mia conclusione è che il logger predefinito var winston = require('winston') non funziona con le funzioni query, stream, né è EventEmitter in modo che sia possibile utilizzare winston.on('logging', function() {...}).

La soluzione è necessario utilizzare è quello di un'istanza per il proprio logger in questo modo:

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

e poi fare un po 'di registrazione:

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

allora è possibile lo streaming già registrato voci utilizzando stream:

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

penso che tu abbia frainteso il stream funzione perché non scorre le voci di registro in tempo reale, ma esegue lo streaming di tutte le voci già registrate. di collegare un evento al logger è possibile utilizzare l'evento 'registrazione' sull'oggetto logger:

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

Non so perché questo non è supportata dal registratore di default e come ho detto all'inizio di questo post ottengo errori all'interno della libreria asincrona (dipendenza da winston) quando si usano le funzioni o stream con il logger predefinito.

+0

Quindi è come un posto di post-elaborazione centralizzato per i registri? –