查看了大量搜索字符串,但无法找到类似的内容:
我正在编写一个自定义日志解析器(ala模拟或webalizer,但不包括webserver),我希望能够跳过已经解析过的行的艰苦工作。我曾考虑使用像webalizer这样的历史文件,但不知道它在内部是如何工作的,我的C很差。
我考虑过散列每一行并写出哈希值,然后解析历史文件以确定它们的存在,但我认为这样做效果不佳。
我唯一能想到的另一种方法是存储最后一次解析的行号并跳过,直到下一次到达该号码为止。日志旋转时会发生什么我不确定。
任何其他想法将不胜感激。我将在ruby中编写解析器,但使用类似语言的提示也会有所帮助。
答案 0 :(得分:1)
当您读取文件并解析行时,请跟踪字节数。保存。在下次读取时,尝试在文件中寻找该字节偏移量。如果文件小于字节数,则它是一个新文件,所以从头开始。
答案 1 :(得分:1)
我现在能想到的解决方案一定很脆弱。
即使您存储了行号并且稍后意识到它将超过当前文件的长度,如果修剪旧行会发生什么?你会在最后一个位置后开始阅读(好)。
另一方面,如果你确定你的日志文件不会被篡改而且它们只会被轮换,我只会看到两种方法来做你想做的事情,我不确定第二个适用于你。
无论如何,这里有。
您存储解析的最后一行以及时间戳。在下一次运行时,您会考虑所有旋转的日志文件按其上次修改日期对它们进行排序,找出您上次读取的日期,并从那里开始阅读。
我没有想到这一点,可能会有一些有趣的角落案例需要处理。
您创建一个持续监视日志文件的后台脚本。 Google上的快速搜索结果显示this gem,但我不确定这是否适合您。即便如此,您可能希望将此解决方案与前一个解决方案集成,以防您的守护程序被中断(因为这显然必定会在某个时刻发生)。