2012-01-24 16 views
30

tail -f logfile.txt wyprowadza ostatnie 10 wierszy pliku logfile.txt, a następnie kontynuuje wysyłanie danych dołączanych w miarę wzrostu pliku.Jak wykonać `tail -f logfile.txt`-like processing in node.js?

Jaki jest zalecany sposób wykonania części -f w pliku node.js?

Poniższa strona przedstawia cały plik (ignorując "pokaż 10 ostatnich linii"), a następnie kończy działanie.

var fs = require('fs'); 
var rs = fs.createReadStream('logfile.txt', { flags: 'r', encoding: 'utf8'}); 
rs.on('data', function(data) { 
    console.log(data); 
}); 

Rozumiem zdarzenie pętli jest wyjściem, ponieważ po zakończeniu strumienia & blisko zdarzeń nie ma więcej wydarzeń - Jestem ciekaw najlepszego sposobu dalszego monitorowania strumienia.

+0

http: // stackoverflow.com/questions/8224333/scrolling-log-file-tail-f-animation-using-javascript – gavenkoa

Odpowiedz

36

Kanoniczny sposób na to jest z fs.watchFile.

Alternatywnie można użyć opcji the node-tail module, która wewnętrznie używa fs.watchFile i wykonała już tę pracę za Ciebie. Oto przykład użycia go prosto z dokumentacją:

Tail = require('tail').Tail; 

tail = new Tail("fileToTail"); 

tail.on("line", function(data) { 
    console.log(data); 
}); 
+0

Wielkie dzięki - 'fs.watchFile' jest dokładnie tym, czego szukałem. Dziękuję również za wskazanie modułu węzłów. – mike

+0

Od tej chwili funkcja 'fs.watchFile()' używa pobierania statystyk. Zamiast tego można użyć 'fs.watch()', ale 'fs.stat()' będzie musiał zostać użyty do znalezienia bieżącego i poprzedniego rozmiaru pliku. – hexacyanide

+0

Od tego czasu moduł węzłowy został zaktualizowany w celu użycia 'fs.watch()'. –

2

można spróbować użyć fs.read zamiast ReadStream

var fs = require('fs') 

var buf = new Buffer(16); 
buf.fill(0); 
function read(fd) 
{ 
    fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buf1) { 
     console.log(buf1.toString()); 
     if (bytesRead != 0) { 
      read(fd); 
     } else { 
      setTimeout(function() { 
       read(fd); 
      }, 1000); 
     } 
    }); 
} 

fs.open('logfile', 'r', function(err, fd) { 
    read(fd); 
}); 

Uwaga napisem oddzwaniania nawet jeśli nie ma żadnych danych, a to właśnie osiągnął koniec pliku. Bez limitu czasu otrzymasz tutaj 100% procesora. Możesz spróbować użyć fs.watchFile, aby natychmiast otrzymać nowe dane.

6

node.js APi documentation na fs.watchFile stany:

Trwałość: 2 - niestabilne. Zamiast tego użyj fs.watch, jeśli jest dostępny.

Funny mimo że mówi prawie dokładnie to samo dla fs.watch:

Trwałość: 2 - niestabilne. Niedostępne na wszystkich platformach.

W każdym razie, ja poszedłem na przodzie i zrobił kolejny mały webapp, TAILGATE, który będzie ogon plików za pomocą wariantu fs.watch.

Możesz to sprawdzić tutaj: TailGate on github.

1

Substack ma moduł file slice, który zachowuje się dokładnie tak, jak tail -f, plik plasterków może przesyłać aktualizacje po początkowym wycinku z 10 linii.

var sf = require('slice-file'); 

var xs = sf('/var/log/mylogfile.txt'); 
xs.follow(-10).pipe(process.stdout); 

Źródło: https://github.com/substack/slice-file#follow

1

https://github.com/jandre/always-tail wydaje się świetnym rozwiązaniem, jeśli trzeba się martwić o log obracanie, przykład z readme:

var Tail = require('always-tail'); 
var fs = require('fs'); 
var filename = "/tmp/testlog"; 

if (!fs.existsSync(filename)) fs.writeFileSync(filename, ""); 

var tail = new Tail(filename, '\n'); 

tail.on('line', function(data) { 
    console.log("got line:", data); 
}); 


tail.on('error', function(data) { 
    console.log("error:", data); 
}); 

tail.watch();