6

Djangoで実行されているサイトがあります。フロントエンドはlighttpdであり、djangoをホストするためにfcgiを使用しています。

fcgiプロセスを次のように開始します。

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid

ロギングのために、次のように定義されたRotatingFileHandlerがあります。

file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8')

ロギングは機能しています。ただし、10Mbは言うまでもなく、10Kbにさえ達しない場合でも、ファイルはローテーションしているように見えます。私の推測では、各fcgiインスタンスは10個のリクエストのみを処理し、その後再生成します。fcgiがリスポーンするたびに、新しいファイルが作成されます。fcgiが新しいプロセスIDで頻繁に起動していることを確認します(正確に時間を知るのは難しいですが、1分未満です)。

この問題を回避する方法はありますか?サイズ制限に達するまで、すべてのfcgiインスタンスを1つのファイルに記録したいと思います。サイズ制限に達すると、ログファイルのローテーションが行われます。

4

3 に答える 3

6

Alexが述べたように、ロギングはスレッドセーフですが、標準ハンドラーを安全に使用して、複数のプロセスから単一のファイルにロギングすることはできません。

ConcurrentLogHandlerはファイルロックを使用して、複数のプロセス内からのロギングを可能にします。

于 2010-01-27T20:12:10.573 に答える
2

あなたの靴の中で私はTimedRotatingFileHandlerに切り替えます-サイズベースの回転ファイルハンドルがこの問題を引き起こしていることに驚いています(どのプロセスがログエントリを生成しているかに影響されないはずです)が、時限バージョン(あなたが好むパラメータで正確に制御されていない)はそれを解決するはずです。または、さまざまなプロセスが問題にならないようにする、独自のより堅固なローテーションファイルハンドラー(標準ライブラリソースから多くを取得できます)を作成します(決して問題にならないはずです)。

于 2009-07-30T02:25:32.203 に答える
0

書き込み( "w")ではなく追加( "a")のデフォルトのファイルオープンモードを使用しているように見えるため、プロセスが再生成された場合、既存のファイルに追加し、サイズ制限に達したときにロールオーバーする必要があります。したがって、表示されているのがCGIプロセスの再生成によって引き起こされているかどうかはわかりません。(もちろん、これは、プロセスが再生成されたときにファイル名が同じままであることを前提としています)。

ロギングパッケージはスレッドセーフですが、stdlibでそれを行う標準的な方法がないため、複数のプロセスからの同じファイルへの同時アクセスを処理しません。私の通常のアドバイスは、ソケットサーバーを実装し、それを介して受信したイベントをファイルに記録する別のデーモンプロセスを設定することです。他のプロセスは、ログデーモンと通信するためにSocketHandlerを実装するだけです。その後、すべてのイベントが適切にディスクにシリアル化されます。Pythonのドキュメントには、このニーズの基礎として役立つ可能性のある動作中のソケットサーバーが含まれています。

于 2009-07-30T11:40:40.103 に答える