【问题标题】:How could I incrementally display JSON data but not repeatedly parse and display in WEB如何逐步逐步显示JSON数据,但不会反复解析并在Web中显示
【发布时间】:2013-01-02 09:00:50
【问题描述】:

我有一个日志文件,它是由一个实时运行的脚本记录下来的,现在我要从 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(second) 的 CGI 可能会输出:

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

在某个 URI 处,将被 JS 的 getJSON 读取

并且在时间 T+2(second) 可能会输出:

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


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

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

【问题讨论】:

  • 你在 CGI 中使用什么?在哪个操作系统上?
  • CGI 解析日志并将事件状态输出为 JSON。 RHEL 系统。
  • 我的意思是,您使用什么技术来编写 CGI 脚本?
  • 为什么不将最后一个事件 id 传递给 CGI 脚本,并且只返回在该 id 之后生成的事件?
  • @bfavaretto,谁将最后一个事件 id 传递给 CGI?

标签: javascript json perl web


【解决方案1】:

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

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

当下一个调用到达时,将 inode 编号与您保存的比较:

  • 如果已更改,则文件已被修改(如在 logrotate 之后)。您需要从头开始阅读。
  • 如果mtime 已更改,请使用setpos 查找旧位置并继续解析。
  • 否则,什么都没有改变。

使用此解决方案,您将能够逐块解析文件。请注意,当仅写入一行的一部分时,您有时可能会遇到边缘情况。

编辑:@mob 的评论

【讨论】:

  • 为什么追加到文件会改变inode?最好比较文件的大小。
  • 你是对的,当整个文件被修改时,inode 会发生变化,通常是在 logrotate 之后。我将编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2012-02-09
相关资源
最近更新 更多