【问题标题】:Javascript - Reading from a frequently updated fileJavascript - 从经常更新的文件中读取
【发布时间】:2016-10-24 10:22:44
【问题描述】:

我目前正在为嵌入式系统编写网站。目标是读取一个日志文件并使用日志文件内容修改一个 json 文件。

日志文件不断被另一个程序写入

Web 应用程序将使用 NodeJs 和 socket.io 完成。也许还有另一种方法可以在 html 页面上实时显示这些日志数据?

如果我只是打开日志文件,它会锁定它吗?我有时间打开它,执行算法并在 1 秒内关闭它吗?

有没有办法让它保持打开并始终阅读最后一行?

我找到了这篇文章:“Reading from a frequently updated file”,但它是用 Python 写的。

附加信息 写入日志文件的程序可以更新。一种可能性是用单行编辑文件(这是大日志文件中的最后一个)。这条独特的线路将每秒更新一次

【问题讨论】:

  • 您正在寻找类似于 Linux 的 tail 命令的东西,对吧?考虑到随着日志文件的增长,重新加载它会花费越来越多的时间(考虑到您的方法似乎包括日志文件大小可能达到几 MB 或更多的情况......不切实际)。
  • 是的,先生,尾巴,但我只需要最后一行,每秒一个新行
  • Hummm.... 可能有解决方案(就像下面 Carlos 建议的那样,但是... 日志文件可以变成多大?看到了吗?获取文件的“TAIL”可能意味着实际扫描它以找到最后一条记录。如果您对写入日志的程序有任何控制,我建议该程序写入两次:一次将一行附加到日志,而第二次写入另一个文件最后一次写行(替换之前的内容)。这可能看起来有点难看,但就性能而言,它可能是最好的解决方案。
  • 看看我的编辑 :)
  • 没错。去吧。

标签: javascript node.js logging real-time


【解决方案1】:

如果你打算使用 Node.js,我建议你使用 node-tail

它允许您以直接的方式“跟踪”文件。根据文档,这就是你的做法:

Tail = require('tail').Tail;

tail = new Tail("fileToTail");

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

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

另外,您可以使用 Node.js 附带的 fs.watchFile

【讨论】:

  • 感谢您的回答。我不熟悉节点尾。是否会在使用新行更新日志时每秒调用一次 "tail.on("line"..." ?
  • Tail 将模拟一个“tail -f”命令,随着文件的增长输出附加的数据。它不是每秒调用一次,而是在文件增长时调用。该事件是异步的。
  • 在我的编辑之后,我还应该在 1 行中使用 node-tail 吗?
  • 如果您有权访问写入日志文件的程序,则无需拖尾日志文件的最后一行。您可以简单地获取将要写入的数据,并在将其写入日志文件的那一刻对其进行任何您想做的事情。当您想要监视文件而不修改写入文件的实际程序时,我提出的解决方案有效。
  • 所以我应该只使用间隔为 1 秒的打开(文件)?
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2013-06-23
  • 2014-09-30
相关资源
最近更新 更多