2012-01-24 11 views
30

tail -f logfile.txt restituisce le ultime 10 righe di logfile.txt e quindi continua a generare dati aggiunti al crescere del file.Come eseguire l'elaborazione `tail -f logfile.txt` in node.js?

Qual è il modo consigliato di eseguire la parte -f in node.js?

Il seguente produce l'intero file (ignorando "mostra le ultime 10 righe") e quindi esce.

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

Capisco l'evento-loop sta uscendo perché dopo la fine flusso & evento close non ci sono più eventi - Sono curioso di sapere il modo migliore per continuare a monitorare il flusso.

+0

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

risposta

36

Il modo canonico per farlo è con fs.watchFile.

In alternativa, è possibile utilizzare solo the node-tail module, che utilizza fs.watchFile internamente e ha già svolto il lavoro per voi. Ecco un esempio di utilizzo direttamente dalla documentazione:

Tail = require('tail').Tail; 

tail = new Tail("fileToTail"); 

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

Molte grazie - 'fs.watchFile' è esattamente quello che stavo cercando. Grazie anche per aver segnalato il modulo node-tail. – mike

+0

A partire da ora, 'fs.watchFile()' utilizza il polling stat. 'fs.watch()' può essere usato al posto, ma 'fs.stat()' dovrà essere usato per trovare la dimensione attuale e precedente di un file. – hexacyanide

+0

Il modulo nodo-coda è stato aggiornato per utilizzare 'fs.watch()'. –

2

si può provare a utilizzare fs.read invece di 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); 
}); 

nota che diceva richiamate anche se non ci sono dati e appena raggiunto la fine del file. Senza timeout otterrai il 100% della CPU qui. Potresti provare a utilizzare fs.watchFile per ottenere immediatamente i nuovi dati.

6

node.js APi documentation su fs.watchFile stati:

Stabilità: 2 - Instabile. Usa invece fs.watch, se disponibile.

divertente, tuttavia, che si dice quasi la stessa cosa per fs.watch:

Stabilità: 2 - Instabile. Non disponibile su tutte le piattaforme.

In ogni caso, sono andato avanti e ha fatto un altro piccolo webapp, portellone, che la volontà di coda i file utilizzando la variante fs.watch.

Sentitevi liberi di verificarlo qui: TailGate on github.

1

Substack ha un modulo file slice che si comporta esattamente come tail -f, lo slice-file può eseguire lo streaming degli aggiornamenti dopo la porzione iniziale di 10 righe.

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

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

Fonte: https://github.com/substack/slice-file#follow

1

https://github.com/jandre/always-tail sembra una grande opzione se si deve preoccupare di log in rotazione, ad esempio dal 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(); 
Problemi correlati