2011-07-06 22 views
0

私はワーカープロセスのプールを持っており(multiprocessing.Poolを使用しています)、これらのログファイルを単一のログファイルに記録します。私は、サーバー、syslogなどのログを認識していますが、それらはすべて私のアプリがインストールされ、監視され、処理されたログなど、私が避けたいものにいくつかの変更を必要とするようです。マルチプロセッシングワーカーからのログ行にコンテキスト情報を追加するにはどうすればよいですか?

私はLinuxでCPython 2.6を使用しています。

最後に私はほとんど私のために働くsolutionにつまずいた。基本的な考え方は、ログリスナープロセスを開始し、そのプロセスとワーカープロセスの間でキューを設定し、ワーカーがキューにログインする(QueueHandlerを使用)、リスナーはログ行をフォーマットしてファイルにシリアル化します。

これは、これまでにリンクされているソリューションに従ってこれまでにすべて動作しています。

しかし、従業員には、ログ行ごとにジョブトークンなどのコンテキスト情報を記録させたいと思っていました。 pool.apply_async()メソッドでは、ログに記録するコンテキスト情報を渡すことができます。私は、作業者が特定の仕事をしている間だけコンテキスト情報に興味があることに注意してください。それがアイドル状態のときには、作業者が何かを記録したい場合には、文脈上の情報はないはずです。だから、基本的には、ログリスナーがログフォーマットのようなもののように指定しています

"%(job_token)s %(process)d %(asctime)s %(msg)" 

と労働者は、ログ・レコードのjob_tokenとして文脈情報を提供することになっている(他の書式指定子が標準です)。

私はcustom log filtersを見ました。カスタムフィルターを使用すると、ジョブの開始時にフィルターを作成してフィルターをルート・ロガーに適用できますが、(通常はモジュールのインポート時に)独自のロガーを作成する第三者モジュールを使用しています。 。

上記の設定でこの方法を使用する方法はありますか?または、この作業を行う別の方法があります(1つのログファイル、別々のログサーバー、ワーカーログラインのジョブ固有のコンテキスト情報を好むでしょう)。

答えて

0

フィルターは、ハンドラーとロガーに適用できます。そのため、フィルターをQueueHandlerに適用することができます。このハンドラがプロセス内のルート・ロガーに接続されている場合は、サード・パーティ・モジュールによるロギングもハンドラで処理する必要があります。そのため、ロギングされたイベントのコンテキストも取得する必要があります。

+0

少し違ったことをやってしまったので、実際に動作するかどうかは確認していません。しかし、ロギングモジュールについての私の理解に基づいて、それはうまくいくはずなので、答えを与えるように思えます。 –

関連する問題