如何在node.js中执行`tail -f logfile.txt`类的处理?

tail -f logfile.txt输出tail -f logfile.txt的最后10行,然后随着文件的增长继续输出附加数据。

在node.js中执行-f部分的build议方法是什么?

以下输出整个文件(忽略“显示最后10行”),然后退出。

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

我知道事件循环正在退出,因为在stream结束和closures事件之后没有更多的事件 – 我很好奇继续监视stream的最佳方式。

执行此操作的规范方法是使用fs.watchFile

或者,您可以使用节点尾模块 ,它fs.watchFile内部使用fs.watchFile ,并且已经为您完成了工作。 以下是直接从文档中使用它的一个例子:

 Tail = require('tail').Tail; tail = new Tail("fileToTail"); tail.on("line", function(data) { console.log(data); }); 

node.js fs.watchFile上的APi文档 :

稳定性:2 – 不稳定。 如果可用,请使用fs.watch。

有趣的是,它说几乎完全相同的事情fs.watch

稳定性:2 – 不稳定。 不适用于所有平台。

无论如何,我继续做了另一个小型Web应用程序TailGate ,它将使用fs.watch变体来拖尾文件。

随意看看这里: 在github上的TailGate 。

您可以尝试使用fs.read而不是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); }); 

请注意,即使没有数据,读取调用callback,它只是到达文件的结尾。 没有超时你会得到100%的CPU在这里。 您可以尝试使用fs.watchFile立即获取新数据。

Substack有一个文件切片模块,其行为与tail -f完全相同,slice文件可以在最初的10行切片之后进行stream更新。

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

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

https://github.com/jandre/always-tail似乎是一个不错的select,如果你不得不担心日志旋转,例如来自自述文件:

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