python - 需要一些关于如何编写日志解析器的想法

标签 python parsing logging

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

最佳答案

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

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

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

总结一下:

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

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

编辑:

WebLog Expert看起来也很有前途。看看 reports 之一.

关于python - 需要一些关于如何编写日志解析器的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328688/

相关文章:

swift - 有什么方法可以覆盖 swift 内置的打印函数,包括常量变量? (#line、#function 等)

python - 如何将 Databricks Spark-csv 包添加到 IBM Bluemix 上的 Python Jupyter 笔记本

python - 如何为 jupyter 笔记本设置自定义 token ?

python - dateutil 解析器用于月/年格式 : return beginning of month

.net - REST 服务中的事件 ID 传播

python - 记录器的 'setLevel' 和连接到记录器的处理程序的 'setLevel' 之间的区别

python - pandas 使用正则表达式从文本中获取值

python - 完全匹配 python 正则表达式 url

Java:哪个解析器最适合根据括号对匹配文本?

parsing - 从 Word 粘贴时,如何阻止 CKEditor 用双 <br> 替换段落