Javascript 如何以增量方式显示JSON数据,而不在WEB中重复解析和显示

Javascript 如何以增量方式显示JSON数据,而不在WEB中重复解析和显示,javascript,json,perl,web,Javascript,Json,Perl,Web,我有一个日志文件,它是由一个实时运行的脚本记录的,现在我将从WEB/HTML的日志中监视脚本的状态,因此我使用JavaScript更新WEB/HTML,还编写了一个CGI脚本来解析日志,并将事件状态输出到JSON以供JavaScript读取。JS脚本定期(例如每2秒)调用CGI来解析日志,并调用getJSON来读取事件状态,然后更新WEB 例如,在时间T(秒),记录的日志文件: 事件1开始 正在做事件1 事件1通行证 事件1结束 在时间T+2(秒)时,记录日志文件: 事件1开始 正在做事件1 事

我有一个日志文件,它是由一个实时运行的脚本记录的,现在我将从WEB/HTML的日志中监视脚本的状态,因此我使用JavaScript更新WEB/HTML,还编写了一个CGI脚本来解析日志,并将事件状态输出到JSON以供JavaScript读取。JS脚本定期(例如每2秒)调用CGI来解析日志,并调用getJSON来读取事件状态,然后更新WEB

例如,在时间T(秒),记录的日志文件:

事件1开始

正在做事件1

事件1通行证

事件1结束

在时间T+2(秒)时,记录日志文件:

事件1开始

正在做事件1

事件1通行证

事件1结束

事件2开始

正在做事件2

事件2失败

事件2结束

时间T(秒)处的CGI可以输出:

{“事件”:[[“事件1”,“传递”]}

在某个URI上,JS的getJSON将读取该URI

并且在时间T+2(秒)可输出:

{“事件”:[[“事件1”,“通过”],[“事件2”,“失败”]}


因此,在这里,我实现的CGI脚本将每2秒钟解析一次整个日志,当日志很大时,这可能会消耗大量系统资源,并对已经完成的事件重复执行操作


任何人都知道如何通过输出而不是整个日志增量解析日志,以及如何存储已完成事件的状态吗?

如果您不想每次都解析整个日志文件,您应该尝试模仿以下行为:

  • 打开日志并解析所有内容(第一次)
  • 使用获取光标位置
  • 获取数字并使用
    mtime
  • 将光标和inode保存在单独的文件中
下次呼叫到达时,将inode号码与您保存的号码进行比较:

  • 如果它已更改,则该文件已被修改(如在logrotate之后)。你需要从头开始阅读
  • 如果
    mtime
    已更改,请使用
    setpos
    搜索到旧位置并继续解析
  • 否则,一切都没有改变
使用此解决方案,您将能够逐块解析文件。请小心,当只写入了行的一部分时,有时可能会出现边缘情况


编辑:@mob的评论

您在CGI中使用了什么?在哪个操作系统上?CGI解析日志并将事件状态输出到JSON。RHEL系统。我的意思是,您使用什么技术来编写CGI脚本?为什么不将最后一个事件id传递给CGI脚本,并只返回在该id之后生成的事件?@bfavaretto,谁将最后一个事件id传递给CGI?为什么附加到文件会更改inode?比较文件的大小更好。没错,当整个文件被修改时,inode会改变,通常是在logrotate之后。我将编辑我的答案。