ホームページ  >  記事  >  バックエンド開発  >  Python はファイルのリアルタイム監視を実装します

Python はファイルのリアルタイム監視を実装します

高洛峰
高洛峰オリジナル
2017-02-25 09:59:281894ブラウズ

ビジネスの安定性要件が比較的高い状況では、問題をタイムリーに検出するために、運用と保守は、問題が発生するのを受動的に待つのではなく、アプリケーションのログをリアルタイムで分析し、特定の条件が満たされたときにすぐに警告する必要がある場合があります。たとえば、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,

最後に、シークの使用法を説明します。 () 関数。この関数は 2 つのパラメーターを受け取ります: file.seek(off, whence=0)、ファイルから操作マーカー (ファイル ポインター) を移動し、正の数は終了方向に移動し、負の数は開始方向に移動します。 whence パラメータが設定されている場合、whence で設定された開始位置が優先されます。0 はファイルの先頭を表し、1 はファイルの現在位置を表し、2 は終了位置を表します。

上記の 3 つの一般的な方法は、独自のビジネス ロジックに従って特定のログ分析コードを実装できます。

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Python のファイルのリアルタイム監視に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。