使用Node.js逐行读取实时文件

时间:2014-11-06 20:08:33

标签: javascript node.js

我正在尝试确定逐行读取实时文件的最佳方法。

该行将被发送消费然后被丢弃。

该文件是活动的,这意味着它正被另一个应用程序(它的日志文件)写入。

文件可能很大,因此我不想将整个内容准备好放入内存然后进行处理。

  • 读取行
  • 处理它
  • 保留所需数据
  • 阅读下一行 等。

似乎有许多插件即模块。不确定最好(快速和有效)的方式是什么。

我使用的是node.js版本0.10.33

由于

3 个答案:

答案 0 :(得分:1)

使用tail。它就像unix tail命令一样,但在节点中。

npm install tail

来自npm页面的用法示例:

Tail = require('tail').Tail;

tail = new Tail("fileToTail", "\n", {}, true);

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

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

答案 1 :(得分:1)

您可以创建阅读流http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options 并在下一行之前阅读。像这样的东西

var lines = [],
  line,
  rs = require('fs').createReadStream('/etc/passwd');

rs.on('data', function(chunk){
  var indx = chunk.indexOf("\n")'
  if( indx !== -1 ) {
      line = line + chunk;
  } else {
      line = line + chunk.chunk(0, indx); //we cut the "\n" symbol.
      lines.push(line); //we add line to array of lines of file
      line = ''; //we clear buffer
  }
});

rs.on('end', function(){
  console.log(lines);
});

答案 2 :(得分:0)

仅限Linux的解决方案是spawn child_process tail -f /path/to/your/log {{1}}并使用stdout做一些事情 - 不是很优雅,但它会起作用。