web-dev-qa-db-ja.com

pythonを使用して書き込まれているログファイルから読み取る

Pythonを使用してリアルタイムでログファイルを読み取る素敵な方法を見つけようとしています。ログファイルの行を、書き込み時に1つずつ処理したいと思います。どういうわけか、ファイルが作成されるまでファイルの読み取りを試行し続け、プロセスを終了するまで行の処理を続ける必要があります。これを行う適切な方法はありますか?ありがとう。

43
Anon

次のようなものを試すことができます:

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

例は here から抽出されました。

26

このPDF 38ページから始まるスライド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
44
Wayne Werner

これはPythonおよびロギングタグ付きであるため、これを行う別の可能性があります。

これはPython logger、logging.Handler based。

(名前付き)ロガーインスタンスを取得し、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を追加しています。

オフサイド:ロガーは初期化されるとすぐにデータを取得するだけなので、すべてのデータを使用可能にするには、最初からデータを初期化する必要があります。 (これが予想されることであることは知っていますが、言及する価値があると思います。)

5
R4PH43L