2016-03-31 12 views
0

このコードは、access.logとパーズイベントを連続して処理します。しかし、ログのローテーション中にaccess.logaccess.log.timestampに移動され、新しいaccess.logがjavaプロセスによって作成されます。このrejigが発生すると、pythonパーサーは新しいaccess.logを解析しません。 Plsはいくつかの手がかりを手助けして、プログラムをファイルの変更時に再ロードする方法を教えてください。Pythonのログファイルをリアルタイムで解析し、ログがローテーションするときにリロードします。

with open('/var/log/app/access.log') as f: 
    while True: 
    line = f.readline() 
    if line: 
     process(line) 
+0

あなたは*新しいのaccess.logの解析を行いません*パイソンパーサーによって意味は何?何かエラーが出ますか? – Kasramvd

+0

ログを回転させたかどうかを示すフラグを使用しますか? – BlackMamba

+0

@ Kasramvd、いいえ、プロセスは責任を負いません。エラーはありません。 –

答えて

2

この問題は、ログ変更時の位置参照を維持するpythonファイルポインタのようです。それでは、ファイルのサイズを調べる前に、ファイルのサイズを調べる前に、seek(0)を使用してpythonファイルポインタを開始する、つまり0にリセットします。私はこのコードを疲れさせていませんが、結果を返すことができるので、同じコードを変更することができます。

import os 

file_path = '/var/log/app/access.log' 

with open(file_path) as f: 
    file_size = 0 
    while True: 
     line = f.readline() 
     if line: 
      print line 
     file_status_obj = os.stat(file_path) 
     if file_size < file_status_obj.st_size: 
      f.seek(0) 
     file_size = file_status_obj.st_size 

・ホープこのことができます:)

+0

ファイルが移動されたときにコードが終了するようになりました。今私は続けることができます。ありがとう! –

+0

@ ManivGを聞くのは素晴らしい – hemraj

1
  • ログファイルは、いくつかの回以降の多くの行を有することができるとき、EOFの追い上げを処理する必要があります。
  • コードハンドラを追加してファイルを再度開くことができます。たとえば、logrotate(RHELの場合)
  • このログプロセッサに通知できない場合は、ファイルのiノードを確認できます。これは、あなたのログの回転がコピーでない場合に有効です&は切り詰めます。

このような場合は、必要な例外処理をすべて確認してください。これは、私の作業システムの部分的なコピーです:

def iNodeOf(file): 
    if os.path.exists(file): 
    s = os.stat(file) 
    return s.st_ino 
    else: 
    return -1 

while True: 
    iReload = False 
    fileInode = iNodeOf(conf.LOGFILE) 
    f = open(conf.LOGFILE, 'r') 
    countDown = 15 
    while (not iReload) and (countDown > 0): 
    # seek to current position again 
    f.seek(0,1) 
    while countDown > 0: 
     filePos = f.tell() 
     line = f.readline() 
     if line: 
      process(line) 
      countDown = 15 
     else: 
      countDown -= 1 
      time.sleep(1) 
    newInode = iNodeOf(conf.LOGFILE) 
    if (fileInode == newInode): 
     # file not changed, sleep, seek from BOF, and try again 
     time.sleep(5) 
     f.seek(filePos,0) 
     countDown = 15 
    else: 
     # file changed 
     f.close() 
     iReload = True 
関連する問題