如何在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();