2011-11-14 10 views
1

私は過去5分間に記録されたJavaアプリケーションログ(log4jを使用)を分析しようとしています。私は最後の5分を分析するPythonを使用する予定です警告がある場合は、私にメールを送信する必要があります。最後の5分Pythonを使用したLog4jログ分析

最後の5分間ログラインを取得する最良の方法は何ですか?

私はこのためにpythonを使用する必要があります。

ログ形式は

2011-11-14 10:15:46 WARN : sample warning 
2011-11-14 10:15:47 WARN : sample warning 
2011-11-14 10:15:48 WARN : sample warning 
2011-11-14 10:15:49 WARN : sample warning 

答えて

0

分析「最後の5分は」本当に多くの意味がありません、以下の通りです。それが私だったら、何かを絶え間なく走らせて、それが5分ごとに発する警告を制限します。

(ファイルにlog4jを書き込むことを前提としています...)あなたのPythonコードでファイルI/Oを処理することができますが、ファイルをスクリプトにパイプするために 'tail'を使用する方が簡単でしょう。明らかに、回転ログファイルの処理方法を計画する必要があります。おそらくすでにこれに何らかのメカニズムがあります。回転後にファイルハンドルを再オープンするようPythonコードに指示する必要があります。

パイプを使用してPythonスクリプトにデータを送信するほうがはるかに簡単で、python handle the rotationとすることができます。

いずれかのログメッセージがない場合にチェックイベントを強制的に実行します。

+0

は当初、私も常に実行中のプログラムを考えていました。しかし、私は長い間、常にシェルスクリプトを実行することに悪い経験をしています。彼らはしばらくするとハングアップするので。これで私は5分でプログラムを1回実行し、これをcronに入れようとしています。 SIGALARMについて言及いただきありがとうございます。私がPythonを初めて使ったので、以前はSIGALARMSを使用していませんでした。あなたのアイデアをありがとう。 – user1045612

3

あなたのログファイルを時系列でソートされているので、あなたは完全にそれを解析する必要があります:

from datetime import datetime, timedelta 
now = datetime.now() 
lookback = timedelta(minutes=5) 
oldest = (now - lookback).strftime('%Y-%m-%d %H:%M:%S') 

lines = [] 

with open('logfile.log', 'r') as f: 
    for line in f: 
     if line[:19] > oldest: 
      lines.append(line) 

if lines: 
    message = '\n'.join(lines) 
    # send message per mail... 
+0

ありがとうございました。これは私を助け、私の問題を解決しました。このプロセスを効率的にするために、ファイルの最後から読むことは良いアイデアだと思いますか? – user1045612

+0

'f.seek(...) 'で再生し、シークを開始したいファイル内の良いバイト位置を見つけることができます。ファイルサイズと更新頻度によって異なります。 – eumiro

関連する問題