Pythonを使用してリアルタイムでログファイルを読み取る素敵な方法を見つけようとしています。ログファイルの行を、書き込み時に1つずつ処理したいと思います。どういうわけか、ファイルが作成されるまでファイルの読み取りを試行し続け、プロセスを終了するまで行の処理を続ける必要があります。これを行う適切な方法はありますか?ありがとう。
次のようなものを試すことができます:
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 から抽出されました。
この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
これは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を追加しています。
オフサイド:ロガーは初期化されるとすぐにデータを取得するだけなので、すべてのデータを使用可能にするには、最初からデータを初期化する必要があります。 (これが予想されることであることは知っていますが、言及する価値があると思います。)