0

我有一个日志文件,它是由一个实时运行的脚本记录的,现在我要从 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 秒解析一次整个日志,当日志很大时可能会消耗大量系统资源,并对已经完成的事件做重复的事情。

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

4

1 回答 1

1

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

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

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

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

使用此解决方案,您将能够逐块解析文件。小心,当只写了一行的一部分时,您有时可能会遇到边缘情况。

编辑:@mob 的评论

于 2013-01-18T16:29:33.647 回答