【问题标题】:Need some ideas on how to code my log parser需要一些关于如何编写日志解析器的想法
【发布时间】:2010-07-25 09:35:44
【问题描述】:

我有一个托管多个虚拟主机的 VPS。每个主机都有自己的 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 时间戳并提取它们之间的数据。简单的。但我更喜欢直接解析日志文件。

【问题讨论】:

    标签: python parsing logging


    【解决方案1】:

    除非您每天创建不同的日志文件,否则您只能根据请求解析整个日志。

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

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

    总结一下:

    • 将您的数据以日分辨率保存在数据库中(例如,每天的带宽)
    • 使用pyinotify 监控对日志文件的写入,这样您就不会一遍又一遍地读取整个文件

    如果您不想编写自己的解决方案,请查看WebalizerAWStats 或从this list 中选择一个工具。

    编辑:

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

    【讨论】:

      【解决方案2】:

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

      您可以每次使用对文件的二进制搜索找到该位置:seek()os.stat(filename).st_size / 2,调用一次readline()(丢弃结果)以跳到当前行的末尾,然后再执行两次readline()s。如果这些行中的第一行在您想要的开始时间之前,第二行在它之后,那么您的起始偏移量是tell() - len(second_line)。否则,执行标准binary search algorithm。 (我忽略了您要查找的行是文件中的第一行或最后一行或根本不在文件中的极端情况,但这些很容易添加)

      一旦有了起始偏移量,您就可以从那里继续解析行,直到找到比您感兴趣的范围新的行。

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

      尽管如此,正如 Pierre 和 the_void 所说,请确保您没有重新发明轮子——您不是第一个需要带宽统计数据的人 :-)

      【讨论】:

        【解决方案3】:

        保存最后一个位置

        完成对日志文件的解析后,将位置保存在引用完整文件路径和位置的数据库表中。 5 分钟后运行解析器时,查询数据库以获取要解析的日志,检索位置并从那里开始。

        保存第一行数据

        当您进行日志轮换时,在数据库中添加一个附加键,该键将包含日志文件的第一行。所以当你从一个文件开始时,首先阅读第一行。当您查询数据库时,您必须检查第一行而不是文件名。

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

        只保存您需要的数据

        在解析 W3C 时,很容易读取发送的字节。如果您只保留该信息,解析将非常快。将其存储在您的数据库中,方法是更新数据库中的现有行,或者添加一个带有时间戳的新行,以便稍后在查询中与其他行聚合。

        不要重新发明轮子

        除非您所做的非常具体,否则我建议您在网络上获取一个开源解析器。 http://awstats.sourceforge.net/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-15
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多