需要一些关于如何编写日志解析器的想法
我有一个虚拟专用服务器(VPS),上面托管着多个虚拟主机。每个主机都有自己的访问日志(access.log)和错误日志(error.log)。目前还没有设置日志轮换,不过这可能会改变。
简单来说,我想解析这些日志,以便监控带宽和收集统计数据。
我的想法是写一个解析器,把信息保存到一个小的sqlite数据库里。这个脚本每5分钟运行一次,使用Python的seek
和tell
方法,从上次解析的位置打开日志文件。这样可以避免每5分钟都解析一个10GB的日志文件,因为我只需要最后面的新信息(记住,没有日志轮换)。
经过一番思考,我意识到我只是把日志文件里的信息搬到数据库里... 就是把数据从一个地方移动到另一个地方 :/
那么我还有什么其他的方法呢?我想能做到类似这样的事情:
python logparse.py --show=bandwidth --between-dates=25,05|30,05 --vhost=test.com
这将打开test.com的日志文件,并显示指定5天内的带宽使用情况。
现在,我的问题是,如何避免解析10GB的数据,而我只想要5天的数据呢?
如果我按照每5分钟把日志数据保存到数据库的想法,我可以直接保存日期的unix时间戳,然后提取这段时间的数据。这样很简单。但我更希望直接解析日志文件。
3 个回答
保存最后的位置
当你完成了对日志文件的解析后,记得把当前位置保存到数据库里的一个表中,这个表要包含完整的文件路径和当前位置。这样,当你在5分钟后再次运行解析器时,就可以查询数据库,找到你要解析的日志,取出位置,然后从那里开始。
保存数据的第一行
如果你有日志轮换的情况,记得在数据库中添加一个额外的字段,用来存储日志文件的第一行内容。这样,当你开始处理一个文件时,首先读取第一行。当你查询数据库时,就要检查第一行,而不是文件名。
第一行应该是唯一的,因为你有时间戳。但要注意,符合W3C标准的日志文件通常在文件开头会写一些标题信息。所以,第一行应该是数据的第一行。
只保存你需要的数据
在解析W3C日志时,读取发送的字节非常简单。如果你只保留这些信息,解析会非常快。然后把这些数据存入数据库,可以选择更新数据库中已有的行,或者添加一行新数据,带上时间戳,方便以后在查询时进行汇总。
不要重复造轮子
除非你做的事情非常特殊,否则我建议你在网上找一个开源的解析器来用。http://awstats.sourceforge.net/
从一个大日志文件中提取所需的5天数据,关键在于找到一个合适的起始位置,这样你才能开始解析文件。
你可以通过在文件中进行二分查找来找到这个位置:先用 seek()
移动到文件大小的一半,即 os.stat(filename).st_size / 2
,然后调用 readline()
一次(可以忽略这次读取的结果),这样可以跳到当前行的末尾,再读取两次 readline()
。如果第一行的时间在你想要的起始时间之前,而第二行的时间在之后,那么你的起始位置就是 tell() - len(second_line)
。如果不符合这个条件,就按照标准的 二分查找算法 来处理。(我这里忽略了一些特殊情况,比如你要找的行是第一行或最后一行,或者根本不在文件里,这些情况其实也很简单处理)
一旦你找到了起始位置,就可以从那里开始解析行,直到遇到一行的时间超过你感兴趣的范围为止。
这样做比每次都解析整个日志文件要快得多,但如果你要进行很多这样的查询,使用数据库可能会更有价值,尽管这会增加一些复杂性。如果你担心数据库的大小,可以考虑一种混合的方法,把数据库作为日志文件的索引。例如,你可以在数据库中只存储每一天开始的字节偏移量。如果你不想每5分钟就更新数据库,可以让 logparse.py
在每次运行时更新新数据。
不过,正如Pierre和the_void所说的,确保你不是在重复造轮子——你并不是第一个需要带宽统计数据的人 :-)
除非你为每天创建不同的日志文件,否则你只能在需要时解析整个日志文件。
我还是建议用数据库来存储日志数据,这样可以按照你想要的时间单位来整理数据,比如按天或按小时来记录带宽。使用数据库的另一个好处是,你可以很方便、快速地进行范围查询,比如你在例子中提到的那种。当你有一些旧数据不再需要时,可以从数据库中删除它们,以节省空间。
而且,你不需要每次都解析整个文件。你可以使用pyinotify来监控文件的写入情况,每当有新的一行写入时,就可以更新数据库中的计数器。或者你可以在读取文件时记录下最后的位置,下次再从那个位置开始读取。要小心文件被截断的情况。
总结一下:
- 在数据库中按天保存数据(比如每天的带宽)
- 使用
pyinotify
来监控日志文件的写入,这样就不需要一次又一次地读取整个文件
如果你不想自己编写解决方案,可以看看Webalizer、AWStats,或者从这个列表中选择一个工具。
编辑:
WebLog Expert看起来也很不错。可以看看其中一个报告。