逐步读取日志

时间:2014-11-04 21:05:55

标签: ruby parsing logfiles

查看了大量搜索字符串,但无法找到类似的内容:

我正在编写一个自定义日志解析器(ala模拟或webalizer,但不包括webserver),我希望能够跳过已经解析过的行的艰苦工作。我曾考虑使用像webalizer这样的历史文件,但不知道它在内部是如何工作的,我的C很差。

我考虑过散列每一行并写出哈希值,然后解析历史文件以确定它们的存在,但我认为这样做效果不佳。

我唯一能想到的另一种方法是存储最后一次解析的行号并跳过,直到下一次到达该号码为止。日志旋转时会发生什么我不确定。

任何其他想法将不胜感激。我将在ruby中编写解析器,但使用类似语言的提示也会有所帮助。

2 个答案:

答案 0 :(得分:1)

当您读取文件并解析行时,请跟踪字节数。保存。在下次读取时,尝试在文件中寻找该字节偏移量。如果文件小于字节数,则它是一个新文件,所以从头开始。

答案 1 :(得分:1)

我现在能想到的解决方案一定很脆弱。

即使您存储了行号并且稍后意识到它将超过当前文件的长度,如果修剪旧行会发生什么?你会在最后一个位置后开始阅读(好)。

另一方面,如果你确定你的日志文件不会被篡改而且它们只会被轮换,我只会看到两种方法来做你想做的事情,我不确定第二个适用于你。

无论如何,这里有。

第一种解决方案

您存储解析的最后一行以及时间戳。在下一次运行时,您会考虑所有旋转的日志文件按其上次修改日期对它们进行排序,找出您上次读取的日期,并从那里开始阅读。

我没有想到这一点,可能会有一些有趣的角落案例需要处理。

第二种解决方案

您创建一个持续监视日志文件的后台脚本。 Google上的快速搜索结果显示this gem,但我不确定这是否适合您。即便如此,您可能希望将此解决方案与前一个解决方案集成,以防您的守护程序被中断(因为这显然必定会在某个时刻发生)。