現在、pyinotify を使用して irssi (Linux コマンド ライン用の irc クライアント) ログ ファイルを監視しています。このログ ファイルは、pyinotify の IN_MODIFY マスクを使用して irssi によって書き込まれます。変更されましたが、行で特定のフレーズを見つけようとしています。この行では、フレーズは次のとおりです。
COMPLETE:
これで、最後の行をチェックしてそこにあるかどうかを確認するコードがありますが、ボットの読み取りのためにすべてが一度に読み込まれるため、irssi がログファイルにチャンクで書き込むことがあります。このコードは正常に動作します。私が問題を抱えているのは、COMPLETE: 句が含まれる一番下に最も近い最後の行を見つけることです。
私はおそらく間違っていることを知っていますが、私が思いついた方法(そしてそれは機能しないので、私は間違っています)は、最後の COMPLETE: 行を保存し、その行を検索し、ループを列挙することです最後の行が見つかった行番号のオフセットでファイルを上書きし、その後の各完全な行を処理します。以下はコードです。誰かがアイデアを持っている場合、またはこれを行うためのより良い方法がある場合は、大歓迎です!
def getlastline(self):
logfile = "/home/user/irclogs/kta/#kta-all.log"
with open(logfile, "rb") as f:
if self.lastline != "":
#This part doesn't work.
thenum = 0
for num, line in enumerate(f, 1):
if line == self.lastline:
thenum = num
if thenum == 0:
return
for i, ln in enumerate(f, thenum):
if ln.find("COMPLETE:") > 0:
self.setlast(ln)
self.extractdata(ln)
return
else:
#This part here works
first = f.readline()
f.seek(-2, 2)
while f.read(1) != "\n":
f.seek(-2, 1)
last = f.readline()
if last.find("COMPLETE:") > 0:
self.setlast(last)
self.extractdata(last)
else:
#This part doesn't work
for line in reversed(f.readlines()):
if line.find("COMPLETE:") > 0:
self.setlast(line)
return
編集:
self.extractdata は、取得している行の特定の部分を正規表現する関数であり、行は getlastline 関数から self.extractdata に送信され、self.setlast はテストのために self.lastline と print の何かを設定するだけです。
def __init__(self):
self.lastline = ""
def setlast(self, line):
self.lastline = line
print "Next-Newest complete line found."