1

特定の行を別のファイルに抽出し、リモート サーバーに rsync するメール ログ パーサーをセットアップしようとしています。私が抱えている問題は、rsync が書き込まれているファイルを読み取るときに、パーサーの機能が停止するように見えることです。これは、メールログが一貫して書き込まれているため、パーサーが tail -f をエミュレートしているためだと思います。

では、rsync がこのコード (result_file) で書いているファイルにアクセスできるようにするにはどうすればよいでしょうか。

#! /usr/bin/python

import time, re, sys

result_file = open('/var/log/mrp_mail_parsed.log', 'a+')


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

if __name__ == '__main__':
    logfile = open('/var/log/maillog', 'r')
    logline = tail(logfile)
    for line in logline:
        match = re.search(r'.+postfix-mrp.+', line)
        if match:
            result_file.write(line,)
            result_file.flush()
4

2 に答える 2

1

誰がどのようにファイルを書いているのかわからないので、確信は持てませんが、あなたの問題がこれである可能性が高いと思います:

ファイルがインプレースに追加されておらず、代わりに書き換えられている場合、コードはファイルの追跡を停止します。これをテストするには:

import sys
import time

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

with open(sys.argv[1]) as f:
    for line in tail(f):
        print(line.rstrip())

今:

$ touch foo
$ python tailf.py foo &
$ echo "hey" >> foo
foo
$ echo "hey" > foo

何が起こっているかをよりよく確認するには、を介して inode とサイズを確認してみてくださいstat。スクリプトが開いているファイルとは異なるファイルをパスが参照するとすぐに、スクリプトは他の誰も二度と触れないファイルを監視します。

また、誰かがファイルをその場で切り詰めて書き換えている可能性もあります。これは inode を変更しませんが、ファイルの終わりを過ぎた位置から読み取ろうとしているため、何も読み取れないことを意味します。

rsync されているファイルがこれを引き起こしているのか、それとも単なる偶然なのか、私にはわかりません。実行しているコマンドが不明なrsync場合や、そのコマンドの実行時にファイルが置き換えられているか、ファイルが切り捨てられて書き換えられているかを確認したりしないと、推測するしかありません。

于 2013-05-23T23:22:09.733 に答える
0

rsync が問題を引き起こしているとは思いません。ファイルを読み取る別のプロセスがライターに影響を与えるべきではありません。これは、rsync を一時停止することで簡単にテストできます。

問題は、ファイルの終わりに達したときのpythonのファイル読み取りの処理にあると思います。動作することが保証されている大雑把な方法は、最後の EOF でオフフェストを記憶するために読み取ることです ( を使用tell())。新しい読み取りごとに、ファイルを再度開き、記憶されているオフセットを探します。

于 2013-05-23T23:20:55.007 に答える