簡體   English   中英

從使用 python 寫入的日志文件中讀取

[英]Read from a log file as it's being written using python

我正在嘗試找到一種使用 python 實時讀取日志文件的好方法。 我想在寫入時一次處理一個日志文件中的行。 不知何故,我需要繼續嘗試讀取文件,直到它被創建,然后繼續處理行,直到我終止進程。 有沒有合適的方法來做到這一點? 謝謝。

從第 38 頁開始查看此 PDF ,~幻燈片 I-77,您將找到所需的所有信息。 當然,其余的幻燈片也很精彩,但那些專門針對您的問題:

import time
def follow(thefile):
    thefile.seek(0,2) # Go to the end of the file
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1) # Sleep briefly
            continue
        yield line

你可以嘗試這樣的事情:

import time

while 1:
    where = file.tell()
    line = file.readline()
    if not line:
        time.sleep(1)
        file.seek(where)
    else:
        print line, # already has newline

示例是從這里提取的。

由於這是 Python 並帶有日志標記,因此還有另一種可能性。

我假設這是基於 Python 記錄器,基於 logging.Handler。

您可以創建一個獲取(命名)記錄器實例的類並覆蓋emit函數以將其放到 GUI 上(如果您需要控制台,只需將控制台處理程序添加到文件處理程序中)

例子:

import logging

class log_viewer(logging.Handler):
    """ Class to redistribute python logging data """

    # have a class member to store the existing logger
    logger_instance = logging.getLogger("SomeNameOfYourExistingLogger")

    def __init__(self, *args, **kwargs):
         # Initialize the Handler
         logging.Handler.__init__(self, *args)

         # optional take format
         # setFormatter function is derived from logging.Handler 
         for key, value in kwargs.items():
             if "{}".format(key) == "format":
                 self.setFormatter(value)

         # make the logger send data to this class
         self.logger_instance.addHandler(self)

    def emit(self, record):
        """ Overload of logging.Handler method """

        record = self.format(record)

        # ---------------------------------------
        # Now you can send it to a GUI or similar
        # "Do work" starts here.
        # ---------------------------------------

        # just as an example what e.g. a console
        # handler would do:
        print(record)

我目前正在使用類似的代碼添加一個 TkinterTreectrl.Multilistbox 以在運行時查看記錄器輸出。

Off-Side:記錄器僅在初始化后立即獲取數據,因此如果您想獲得所有數據,則需要在一開始就對其進行初始化。 (我知道這是預期的,但我認為值得一提。)

也許你可以做一個系統調用

tail -f

使用 os.system()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM