ビジネスの安定性要件が比較的高い状況では、問題をタイムリーに検出するために、運用と保守は、問題が発生するのを受動的に待つのではなく、アプリケーションのログをリアルタイムで分析し、特定の条件が満たされたときにすぐに警告する必要がある場合があります。たとえば、nginx の $request_time と $upstream_response_time を監視し、最も時間のかかるリクエストを分析してコードを改善する場合、長いステートメントが見つかった場合は、ログをリアルタイムで分析する必要があります。もちろん、これはアプリケーション シナリオの 1 つであるため、今日は Python の使用方法を見ていきます。リアルタイムでファイルを監視する方法の例を 3 つ挙げます::
最初の例:
Linux には tail コマンドがあることは誰もが知っているので、 Popen() 関数を直接使用してこのコマンドを呼び出し、実行して出力を取得できます。コードは次のとおりです:logfile='access.log' command='tail -f ‘+logfile+'|grep “timeout”‘ popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) while True: line=popen.stdout.readline().strip() print line
2 番目のタイプ:
は、Python を使用してファイルを操作することによって実装されます。ファイルオブジェクトのtell()メソッドとseek()メソッドを使用して、それぞれ現在のファイル位置と移動先の場所を取得します。コードは次のとおりです:import time file = open(‘access.log') while 1: where = file.tell() line = file.readline() if not line: time.sleep(1) file.seek(where) else: print line,
3番目のメソッド:
Pythonのyieldを使用してジェネレータ関数を実装し、ログファイルが変更されたときに新しい行が出力されるようにこのジェネレータ関数を呼び出します。コードは次のとおりです:import time def follow(thefile): thefile.seek(0,2) while True: line = thefile.readline() if not line: time.sleep(0.1) continue yield line if __name__ == ‘__main__': logfile = open(“access-log”,”r”) loglines = follow(logfile) for line in loglines: print line,