读取添加到海量文件中的新信息



我正在编写一个Python脚本来解析Squid(http://www.squid-cache.org/)日志文件。虽然每天都要轮换日志以防止它们变大,但每天结束时它们确实会达到40-90MB。

本质上我正在做的是逐行读取文件,解析出我需要的数据(IP,请求的URL,时间)并将其添加到sqlite数据库。然而,这似乎花了很长时间(它已经运行超过20分钟了)

显然,不能重新读取文件。我想做的是读取文件,然后检测所有写入的新行。或者更好的是,在一天开始时,脚本将在添加数据时简单地实时读取数据,因此永远不会有任何长时间的处理时间。

我该怎么做呢?

实现这一目标的一种方法是模拟tail -f。脚本将不断地监视文件,并处理出现的每一行新行。

有关讨论和一些方法,请参见tail -f in python with no time.sleep

这样做的一种方法是通过py-inotify http://pyinotify.sourceforge.net/使用文件系统监视,并设置一个回调函数,以便在任何时候执行日志文件大小改变。

另一种不需要外部模块的方法是在文件系统中记录(可能在您的sqlite数据库本身上),在日志文件上读取的最小行末尾的偏移量(您可以使用file.tell()),并且只读取新添加的行从那个偏移量开始,这是通过在遍历行之前简单地调用file.seek(offset)来完成的。

跟踪偏移量和另一篇文章中描述的"尾部"仿真的主要区别在于,这一仿真允许脚本多次运行,也就是说,不需要持续运行,也不需要在崩溃时恢复。

最新更新