質問

Djangoで実行中のサイトがあります。フロントエンドはlighttpdであり、djgiをホストするために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つのファイルにログを記録し、そのサイズに達するとログファイルのローテーションが行われます。

役に立ちましたか?

解決

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

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

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top