2010-07-25 67 views
2

我有一个虚拟主机托管多个虚拟主机。每个主机都有自己的access.log和error.log。目前,没有日志轮转设置,但这可能会改变。需要关于如何编码我的日志解析器的一些想法

基本上,我想解析这些日志来监视带宽并收集统计信息。

我的想法是写一个解析器并将信息保存到一个小的sqlite数据库。该脚本将每5分钟运行一次,并使用Python的seektell方法从最后解析的位置打开日志文件。这使我无法每隔5分钟解析一个10GB的日志文件,当我需要的是坐在它的最后的新信息时(没有记录旋转,请记住?)。

经过一番思考,我意识到,我做的是从日志文件中取信息,并把它们放入一个数据库......从一个位置移动到另一个数据:/

所以怎么回事我可以这样做吗? 我希望能够做一些事情,如:

python logparse.py --show=bandwidth --between-dates=25,05|30,05 --vhost=test.com 

这将打开test.com的日志文件,并告诉我用于指定的5天的带宽。

现在,我的问题是,当我只想要5天的数据时,我该如何防止自己解析10GB的数据?

如果我想用我的想法将日志数据每5分钟保存到一个数据库中,我可以保存日期的unix时间戳并在它们之间提取数据。简单。但我宁愿直接解析日志文件。

回答

0

保存的最后一个位置

当你有一个日志文件的解析完成后,保存在数据库中引用两个完整的文件路径和位置的表中的位置。 5分钟后运行解析器时,您将查询数据库以查找要解析的日志,检索位置并从此处开始。

保存数据

当你登录旋转,添加数据库中的其它附加键将包含日志文件的第一行的第一线。所以当你从一个文件开始时,首先阅读第一行。当你查询数据库时,你必须检查第一行而不是文件名。

第一行应始终是唯一的,因为您有时间戳。但请不要忘记,符合W3C标准的日志文件通常在文件的开头写入标题。所以第一行应该是第一行数据。

保存数据,你只需要

当解析W3C,这是非常容易阅读发送的字节数。如果只保留这些信息,解析速度将非常快。通过更新数据库中现有的行,或者添加一个带有时间戳的新行,将其存储在数据库中,以便在查询中稍后与其他人聚合。

不要重新发明轮子

除非你正在做的是非常具体的,我推荐你抢在网络上的开源解析器。 http://awstats.sourceforge.net/

2

除非您为每一天创建不同的日志文件,否则除了根据请求解析整个日志以外,没有其他办法。

我仍然会使用数据库来保存日志数据,但是使用您想要的时间单位分辨率(例如,以一天/小时的间隔保持带宽)。使用数据库的另一个优点是,您可以非常容易地进行范围查询,例如您在示例中给出的范围查询,并且可以快速地进行。无论何时您不再需要旧数据,都可以将其从数据库中删除以节省空间。

此外,您不需要每次都解析整个文件。每当写入一行时,您都可以在pyinotify的帮助下监视对文件的写入操作,您可以更新数据库中的计数器。或者,您可以在每次读取文件时将最后一个位置存储在文件中,并在下次读取该位置。当文件被截断时要小心。

概括起来:

  • 在一天分辨率保持在数据库中的数据(例如,每一天的带宽)
  • 使用pyinotify监视写入日志文件,这样你不“T在读取整个文件并通过再次

如果您不想编写自己的解决方案,看看WebalizerAWStatsthis list选择一个工具。

编辑:

WebLog Expert也看起来很有希望。看看其中一个reports

1

从大型日志文件中提取所需的5天数据归结为找到正确的起始偏移量,以便在开始解析之前查找()该文件。

你可以使用通过文件二进制搜索,每次发现的位置是:seek()os.stat(filename).st_size/2,调用readline()一次(丢弃结果)跳到当前行的结尾,然后做两个readline()秒。如果第一行是在你想要的开始时间之前,第二行是在它之后,那么你的起始偏移量是tell() - len(second_line)。否则,请执行标准binary search algorithm。 (我忽略了你要找的那一行是第一个或最后一个或不在文件中的角落案例,但这些都很容易添加)

一旦你有了你的起点抵消,从那里解析行,直到你到达一个比你感兴趣的范围更新的行。

这比每次解析整个日志文件要快得多,但是如果你要做很多事情在这些查询中,那么数据库可能是值得的额外的复杂性。如果数据库的大小是一个问题,您可以采用混合方法,其中数据库是日志文件的索引。例如,您可以将每天开始的字节偏移量存储在数据库中。如果您不想每5分钟更新一次数据库,则每次运行时都可以用新数据更新该数据库logparse.py

尽管如此,正如Pierre和the_void所说的那样,确保你不会重复发明轮子 - 你不是第一个需要带宽统计的人:-)