我正在使用Python脚本来解析Squid(http://www.squid-cache.org/)日志文件。虽然日志每天都会轮换以阻止它们变大,但它们确实会在每天结束时达到40-90MB之间。
基本上我正在做的是逐行读取文件,解析出我需要的数据(IP,请求的URL,时间)并将其添加到sqlite数据库。然而,这似乎需要很长时间(现在已超过20分钟)
很明显,无法重新读取文件。我想要做的是读取文件,然后检测所有写入的新行。或者甚至更好,在一天开始时,脚本将在添加时实时读取数据,因此永远不会有任何漫长的处理时间。
我将如何做到这一点?
答案 0 :(得分:2)
实现这一目标的一种方法是模仿tail -f
。该脚本将不断监视文件并处理出现的每一个新行。
有关讨论和一些食谱,请参阅tail -f in python with no time.sleep
答案 1 :(得分:0)
执行此操作的一种方法是使用py-inotify http://pyinotify.sourceforge.net/进行文件系统监视 - 并设置每次执行的回调函数 日志文件大小已更改。
另一种方法是在文件系统中记录而不需要外部模块
(可能在你的sqlite数据库本身上),日志文件中读取的最小行结尾的偏移量(你用file.tell()
得到的),并且只读取新添加的行
从那个偏移开始,这是通过在循环遍历行之前对file.seek(offset)
进行简单调用来完成的。
跟踪偏移的主要区别和他在另一篇文章中描述的“尾部”仿真是这个允许你的脚本多次运行,即 - 不需要它连续运行,或者恢复在崩溃的情况下。