2015-09-22 21 views
9

Utworzona:Przekierowywanie stdout do pliku nodejs

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' }); 

Następnie rurami:

process.stdout.pipe(access); 

Potem próbowałem:

console.log("test"); 

I nic nie pojawił się w katalogu/var/log/node/api.access.log. Jednak ten sposób działa:

process.stdout.pipe(access).write('test'); 

Czy ktoś mógłby wyjaśnić, co robię źle?

+0

Tak, naprawdę jestem zaskoczony, że możesz dzwonić do rur na zapisywalnym bez błędu, co z tym? –

Odpowiedz

1

process.stdout jest zapisywalny. pipe to metoda dokumentacji Readable (Por StreamAPI: https://nodejs.org/api/stream.html

można zobaczyć dokumentację process.stdout tutaj: https://nodejs.org/api/process.html#process_process_stdout

To zaskakujące, że można zrobić process.stdout.pipe(...); bez żadnego błędu, ale przypuszczam to wezwanie tylko nic nie robić.. z wyjątkiem zwrotu nowego Writable strumień binded do stdout (a może to wraca sama process.stdout nie ma specyfikacji, że w dokumentacji).

Jeśli chcesz przekierować stdout do pliku, masz wiele rozwiązań.

  • Wystarczy użyć linii poleceń, aby to zrobić. Styl systemu Windows: node myfile.js > api.access.log.
  • Zastąp obiekt konsoli swoim własnym obiektem. Możesz także przepisać metody konsoli.
  • Nie jestem pewien, ale może to być możliwe, aby zastąpić process.stdout z własnym strumieniem (i możesz robić, co chcesz z tym)
+0

Dzięki. Twoja odpowiedź jest pomocna. Na razie zdecydowałem się przerobić metodę console.log, ale mam nadzieję znaleźć bardziej konstruktywne rozwiązanie. – Supervision

+0

tak, naprawdę jestem zaskoczony, że możesz dzwonić do rur na zapisywalnym bez błędu, co z tym wspólnego? –

+0

Zgodnie z nodejs [oficjalny dokument] (https://nodejs.org/api/process.html#process_process_stdout) process.stdout jest strumieniem dupleksowym – Alex

15

I rozwiązał ten problem w następujący sposób:

var access = fs.createWriteStream('/var/log/node/api.access.log'); 
process.stdout.write = process.stderr.write = access.write.bind(access); 

Oczywiście możesz także oddzielić standardowe wyjście i stderr, jeśli chcesz.

Ja również gorąco polecam obsłużyć niezłapane wyjątki:

process.on('uncaughtException', function(err) { 
    console.error((err && err.stack) ? err.stack : err); 
}); 

ten obejmie następujące sytuacje:

  • process.stdout.write
  • process.stderr.write
  • console.log
  • konsola.dir
  • console.error
  • someStream.pipe (process.stdout);
  • nowy błąd ("Awaria");
  • rzut "nigdy tego nie rób";
  • throw undefined;
+1

Znuż się, jeśli nadpisujesz "process.stdout.write", możesz nie pisz już do konsoli. – richardpringle

+0

Czy część "uncaughtException" nie będzie duplikować tego samego komunikatu o błędzie w tym pliku logowania, ponieważ stderr jest mimo to przekierowywany do pliku? – user36476

+0

@ użytkownik36476 Nie, ponieważ węzeł tylko drukuje tę wiadomość, jeśli nie ma detektora dla zdarzenia uncaughtException. – user3173842

0

Zamówienie console.Console, klasa nadrzędna normy console.

var myLogFileStream = fs.createWriteStream(pathToMyLogFile); 

var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

Następnie można użyć myConsole.log, myConsole.error, myConsole.dir itp i pisać bezpośrednio do pliku.

Można również monkey patchprocess.stdout.write następująco:

var fn = process.stdout.write; 

function write() { 
    fn.apply(process.stdout, arguments); 
    myLogFileStream.write.apply(myLogFileStream, arguments); 
} 

process.stdout.write = write; 

istnieją również inne opcje nadpisywania console._stdout zależności od motywacji do rejestrowania stdout do pliku.