loggingのRotatingFileHandlerやTimedRotatingFileHandlerは複数プロセスの場合問題が起こる

今回はlogging.handlersのRotatingFileHandlerやTimedRotatingFileHandlerを使ってmultiple workers(=複数プロセス)で実行した場合に、一部のログが書き込まれないことがあるということについてご紹介いたします。



loggingのRotatingFileHandlerやTimedRotatingFileHandlerは複数プロセスの場合問題が起こる

Djangoでログローテーションでログを取ろうとした際にRotatingFileHandlerやTimedRotatingFileHandlerを使うと一部のログが書き込まれないことがあります。
原因は、複数プロセスでログを書き込んでログローテーションをしたときに、最後のプロセスが前のプロセスのログを上書きしてログローテーションしてしまうことが原因です。

特にTimedRotatingFileHandlerについてかなり詳しく調べてみましたが、下記のようなプルリクエストを見つけました。(2021年12月時点では未マージの状態です)
https://github.com/python/cpython/pull/26553

ちなみに上記のプルリクエストの内容のソースコードをローカルにて実行しましたが、後のプロセスが前のプロセスのログを上書きせず、別名(コピー&ペーストした時のような(1)などがつく命名方法)にしてログローテーションを行なっていく内容でした。

では、どうやって複数プロセスでログの消失を防いでログローテーションを行うかというと、下記のような「concurrent-log-handler」というライブラリを使えば可能です。
https://chico-shikaku.com/2021/12/concurrent-log-handler-settings/

しかし、上記のライブラリはTimedRotatingFileHandlerのように時間区切りでログローテーションを行うのではなく、ファイルサイズごとにログローテーションを行う処理となります。

おそらく複数プロセスの場合にログを損失することなく時間区切りでログローテーションを行うことはかなり難しいようです。

終わりに

今回はlogging.handlersのRotatingFileHandlerやTimedRotatingFileHandlerを使ってmultiple workers(=複数プロセス)で実行した場合に、一部のログが書き込まれない事象が起こるということについてご紹介させていただきました。

最後までお読みいただきありがとうございます。
ブログやTwitterでのシェアOKです。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。

Youtubeチャンネル開設いたしました。
よろしければチャンネル登録お願いいたします。
https://www.youtube.com/channel/UC219XhmSRxmXltTy6COxSMw






Python

Posted by ちこ