【问题标题】:Read multiple log file in realtime实时读取多个日志文件
【发布时间】:2021-10-16 22:16:19
【问题描述】:

我必须从实时存在的日志文件中读取数据。我使用了Reading multiple files in real time? 中提到的代码,但是我只能读取第一个文件,即 system.log。如何迭代读取所有文件,即首先 system.log 然后 wifi.log 并再次重复相同的过程。

import time
import glob
import threading

def follow(thefile):
   thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line


 lock = threading.Lock()

 def printFile(logfile):
    loglines = follow(logfile)
    for line in loglines:
        lock.acquire()
        print (line)
        lock.release()



  if __name__ == '__main__':
      files=['system.log','wifi.log']
      for log in files:
          logfile = open(log, "r")
          t = threading.Thread(target = printFile,args = (logfile,))
          t.start()

【问题讨论】:

  • 如果你在 unix 上,你可以使用系统调用很容易地实现这一点。这是一个例子:stackoverflow.com/questions/12523044/…
  • @mama 我必须将此代码用于 linux 系统
  • linux 是 unix:所以你可以使用我第一条评论中的链接。
  • 我可以为单个文件做到这一点。我必须对多个文件执行相同的操作。
  • 正如您在问题中看到的,其中一种方法是Non-Blocking,因此您可以使用它同时跟踪多个文件。一会儿我可以给你举个例子。

标签: python multithreading file-io


【解决方案1】:

您可以使用asyncio 库创建一个并发函数来跟踪文件的尾部,然后打印它。

import asyncio

async def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            await asyncio.sleep(0.1)
            continue
        yield line.strip()

async def main(path):
    async for x in follow(open(path)):
        print(x)

for path in ['hej', 'med', 'dig']:
    asyncio.ensure_future(main(path))

loop = asyncio.get_event_loop()
loop.run_forever()

你也可以跳过main函数和follow函数中的yield,直接在follow函数中打印输出而不是传递它。

【讨论】:

  • 仍然在读取第一个文件,而不是全部。
  • 是的,我犯了一个错误。 yield from 显然是阻塞的,所以我们没有得到其余的生成器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多