如何逐步显示JSON数据,但不能在WEB中重复解析和显示

时间:2013-01-18 15:49:23

标签: 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 ......

事件1通过...

事件1结束......

事件2开始......

做第2场事件......

事件2失败......

事件2结束......

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

{“event”:[[“event 1”,“pass”]]}

在某个URI上,将由JS的getJSON

读取

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

{“event”:[[“event 1”,“pass”],[“event 2”,“failed”]]}


所以在这里,我实现的CGI脚本将每2秒解析整个日志,这可能会在日志很大时消耗大量系统资源,并为已经完成的事件重复执行。

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

1 个答案:

答案 0 :(得分:1)

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

  • 打开日志并解析所有内容(第一次)。
  • 使用getpos获取光标位置。
  • 使用inode获取stat号码和mtime
  • 使用光标和inode保存在单独的文件中。

当下一个呼叫到达时,将inode号码与您保存的号码进行比较:

  • 如果已更改,则修改文件(如logrotate之后)。你需要从头开始阅读。
  • 如果mtime已更改,请使用setpos搜索旧位置并继续解析。
  • 否则,一切都没有改变。

使用此解决方案,您将能够按块解析文件块。注意,当只有一部分行被写入时,有时可能会出现边缘情况。

编辑:@ mob的评论