【问题标题】:Python parsing log file to extract events in real timePython解析日志文件实时提取事件
【发布时间】:2012-08-08 04:24:55
【问题描述】:

我有一个将消息记录到文件的进程。

我想实现另一个进程(在 Python 中)解析这些日志(因为它们被写入文件),过滤我感兴趣的行,然后根据第一个进程的状态执行某些操作。

在我继续自己编写一些东西之前,我想知道是否有 Python 中的库可以做这样的事情。

此外,我们将不胜感激有关如何实现类似 Python 的想法。

谢谢。

【问题讨论】:

  • 库是做什么的?过滤行并执行操作?这是一种非常普遍的任务。 ETA:哦,我明白了,你的意思是跟踪新写的行。
  • 有可能在您的日志文件中使用p = subprocess.Popen(['tail -f', file_name], stdout=subprocess.PIPE),然后重复使用p.stdout.readline()。只是一个想法
  • 请记住,使用tail -F 并不适用于所有系统。话虽这么说,这将使实现变得非常容易。
  • 如果您不需要将日志文件用于任何其他目的,您可以将其替换为命名管道(参见 mkpipe 手册页)。然后你会启动主进程和你的python工具,它们会连接到管道的两端,主进程写入它的任何东西都会在你的python输入流中结束。
  • @MvG - 我不控制主进程,所以我认为我不能使用命名管道。

标签: python linux logging


【解决方案1】:

无需运行tail -f。普通的 Python 文件应该可以工作:

with open('/tmp/track-this') as f:
  while True:
    line = f.readline()
    if line:
      print line

这个东西的工作原理几乎与tail -f 完全一样。通过在另一个终端中运行来检查它:

echo "more" >> /tmp/track-this
# alt-tab here to the terminal with Python and see 'more' printed
echo "even more" >> /tmp/track-this

在运行 Python sn-p 之前不要忘记创建 /tmp/track-this

解析和采取适当的行动取决于您。可能应该在单独的线程/进程中执行较长的操作。

停止条件也取决于您,但简单的 ^C 有效。

【讨论】:

  • 嗨@9000,在我的例子中,我正在使用给定的代码解析“access.log”,但是当java进程将当前的access.log移动到access.log.timestamp并创建一个新的@ 987654329@给定的python裁缝没有跟踪新的access.log你能帮我解决这个问题吗?
  • 当日志写入过程重新打开文件时,拖尾过程必须重新打开文件。有时日志轮转进程通知日志写入进程切换日志(见logrotate);如果是这样,它可以同时通知日志拖尾过程。如果日志写入过程自己切换日志,似乎没有容易接收的信号。日志写入过程应该通知您,或者您应该定期记住文件 ctime 和读取位置,关闭文件,查找新文件,然后切换到新文件或重新打开 seek 到以前的位置。
【解决方案2】:

C 程序通常会寻找当前位置以清除任何“文件结束”标志。但是作为@9000 correctly pointed out,python 显然会处理这个问题,所以即使它已经到达文件末尾,你也可以重复读取同一个文件。

不过,您可能需要处理不完整的行。如果您的应用程序将其日志写入片段,那么您要确保处理整行,而不是那些片段。以下代码将完成此操作:

f = open('some.log', 'r')
while True:
    line = ''
    while len(line) == 0 or line[-1] != '\n':
        tail = f.readline()
        if tail == '':
            time.sleep(0.1)          # avoid busy waiting
            # f.seek(0, io.SEEK_CUR) # appears to be unneccessary
            continue
        line += tail
    process(line)

【讨论】:

  • 看起来即使some.log写完程序也不会退出。
  • @atline:是的,代码正在无限循环运行。没有合理的方法来检测日志写入器是否已完成,尽管实际上它可能会最后写入特定的日志行,您可以等待它发生并中断循环。
【解决方案3】:

感谢大家的回答。我也发现了这个。 http://www.dabeaz.com/generators/follow.py

【讨论】:

  • 如果进程将它们写成几个块,那么该代码仍然容易被分割。因此,您可能想要合并答案。生成器风格的方法看起来确实不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多