2012-01-24 18 views
30

tail -f logfile.txt muestra las últimas 10 líneas de logfile.txt, y luego continúa generando datos adjuntos a medida que el archivo crece.¿Cómo hacer el proceso `` tail -f logfile.txt`-like en node.js?

¿Cuál es la forma recomendada de hacer la parte -f en node.js?

A continuación, se emite todo el archivo (ignorando "mostrar las últimas 10 líneas") y luego sale.

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

entiendo el evento de lazo se está cerrando porque después de que el extremo de aguas & estrecha caso no hay más eventos - Tengo curiosidad acerca de la mejor manera de seguir vigilando la corriente.

+0

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

Respuesta

36

La forma canónica de hacerlo es con fs.watchFile.

Como alternativa, puede usar the node-tail module, que usa fs.watchFile internamente y ya ha hecho el trabajo por usted. Aquí está un ejemplo del uso directamente de la documentación:

Tail = require('tail').Tail; 

tail = new Tail("fileToTail"); 

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

Muchas gracias - 'fs.watchFile' es exactamente lo que estaba buscando. También gracias por señalar el módulo de nodo-cola. – mike

+0

A partir de ahora, 'fs.watchFile()' usa sondeo de estadísticas. 'fs.watch()' se puede usar en su lugar, pero 'fs.stat()' tendrá que usarse para encontrar el tamaño actual y anterior de un archivo. – hexacyanide

+0

El módulo node-tail se ha actualizado desde entonces para usar 'fs.watch()'. –

2

se puede tratar de utilizar fs.read en lugar de 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 que decía devolución de llamadas, incluso si no hay datos y que sólo alcanzó el final del archivo. Sin tiempo de espera obtendrá 100% de CPU aquí. Puede tratar de usar fs.watchFile para obtener datos nuevos inmediatamente.

6

node.js APi documentation en fs.watchFile estados:

Estabilidad: 2 - Inestable. Use fs.watch en su lugar, si está disponible.

divertido a pesar de que dice casi exactamente lo mismo que para fs.watch:

Estabilidad: 2 - Inestable. No esta disponible en todas las plataformas.

En cualquier caso, se adelantó e hizo otra pequeña aplicación web, portón trasero, que la cola voluntad de sus archivos utilizando la variante fs.watch.

No dude en consultar aquí: TailGate on github.

1

Substack tiene un módulo file slice que se comporta exactamente como tail -f, slice-file puede transmitir actualizaciones después de la porción inicial de 10 líneas.

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

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

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

1

https://github.com/jandre/always-tail parece una gran opción si usted tiene que preocuparse de registro de rotación, ejemplo del 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(); 
Cuestiones relacionadas