2013-12-10 29 views
7

Dokumentacja Winston posiada sekcję na streaming logs który mówi:Jak działają strumienie dziennika Winstona?

Streaming pozwala przesyłać swoje logi z powrotem z wybranym transportu.

i daje Poniższy przykład kodu:

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

Moje czytanie tego jest, że każda nowa wiadomość dziennika dodaje byłoby wyjście do konsoli. Konfiguracja {start: -1} informuje strumień, aby rozpocząć na końcu pliku, więc wyprowadzane są tylko nowe wpisy dziennika. Oczekuję, że poniższy skrypt Node spowoduje, że każda istniejąca linia pliku test.log będzie wyprowadzana na konsolę, a następnie nowy obiekt będzie wyprowadzany co 500ms później.

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

spodziewałbym się zobaczyć coś jak poniżej:

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

Co faktycznie występuje to, że rejestrowanie działa zgodnie z oczekiwaniami z transportem pliku (plik dostaje nowy wpis w dzienniku co 500ms) ale nie ma wyjścia do konsoli. Linia console.log(log) nigdy nie jest wywoływana.

Czy przegapiłem coś oczywistego, lub źle zrozumiałem cel strumieni dziennika Winstona?

+0

może używają konwencjonalnego zdarzenia "data"? – bevacqua

+0

Miałem ten sam problem i podejrzewam, że nie działa z transportem plików lub konsoli, ponieważ są to dwa, których próbowałem, a wywołanie zwrotne nie jest wywoływane. @Nico, Ten kod jest bezpośrednio z README Winston i w kodzie: obecnie.emituj ("log", log); Problemem jest to, że nic, co próbowałem, nie wydaje się, aby to działało :( –

+1

Dziękuję za potwierdzenie moich podejrzeń @RobinDuckett. Zrobiłbym to jako błąd, ale Winston wygląda mniej więcej martwo: https: // github. com/flatiron/winston/issues/294 Mógłby potrzebować rozwidlenia – drzax

Odpowiedz

9

Doświadczyłem tego samego rodzaju bugg, który opisujesz. Mój wniosek jest taki, że domyślny rejestrator var winston = require('winston') nie działa z funkcjami query, stream ani nie jest EventEmitter, dzięki czemu można używać winston.on('logging', function() {...}).

Rozwiązanie trzeba użyć jest instancję własnego rejestratora tak:

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

a następnie zrobić kilka rejestrowanie:

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

następnie można przesyłać strumieniowo już zalogowany wpisy za pomocą stream:

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

Chyba nie zrozumiałeś o stream Funkcja ta nie przesyła strumieniowo wpisów dziennika w locie, przesyła strumieniowo wszystkie wpisy, które już zostały zarejestrowane. zahaczyć zdarzenie do rejestratora można użyć zdarzenia „rejestrowania” na obiekcie Rejestrator:

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

Nie wiem, dlaczego to nie jest obsługiwany przez domyślną rejestratorem i jak powiedziałem na początku ten post otrzymuję błędy wewnątrz biblioteki asynchronicznej (zależność od winston) przy korzystaniu z funkcji query lub stream z domyślnym rejestratorem.

+0

Czy jest to zatem scentralizowane miejsce przetwarzania postów dla dzienników? –