Windows 環境で動作する Python プログラムを実行中、以下の様なエラーが発生した。

Traceback (most recent call last):
  File "logging\handlers.pyc", line 78, in emit
  File "logging\handlers.pyc", line 141, in doRollover
WindowsError: [Error 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。
Logged from file foo.pyc, line 25


ピッタリの不具合報告が python.org のイシュートラッカーにあがっていた。

Issue4749 : Issue with RotatingFileHandler logging handler on Windows


  • OS は Windows
  • ロギングに RotatingFileHandler を利用
  • subprocess などで spawn し、親子それぞれがログ出力する

ロギングライブラリメンテナーの Vinay Sajip によると、原因は以下

my conjecture is that when the cmd.exe is spawned, it inherits file handles from the parent process (the Python process which is doing the logging). When cmd.exe exits, it closes all its open file handles, thereby pulling the rug out from under the Python process.


  • Linux/Unix 環境
  • Windows 環境のマルチスレッド



It needn’t *just* be for logging – as long as it doesn’t spawn any child processes. And the need to run a separate process stems from the fact that there’s no reliable cross-platform way (in the Python stdlib) of synchronising access to a resource (such as a file) from multiple processes.


fork したプロセスが同じファイルにロギングするアーキテクチャーの場合のベスト・プラクティスも Vinay Sajip が答えてくれている。

Don’t use RotatingFileHandler in any process which spawns a subprocess. In a multiprocess situation where you want to use rotating log files, have a dedicated subprocess (which does not spawn any children) which listens for logging events on a socket and writes them to the rotated log. Have every other process use SocketHandler to log events to the aforementioned dedicated process.

Logging Cookbook の “§ Sending and receiving logging events across a network” にあるように、各プロセスがログファイルを直接操作するのではなく、logging.handlers.SocketHandler でネットワーク経由でロギングし、ログサーバを SocketServer で用意して、ファイルシステムへのロギング処理はこのサーバに集約しろということらしい。


こちらとしては、ログ用にサーバを建てると、サービス起動させるプログラムが一つ増え、システム管理的に色々嬉しくない上に、追いにくい不具合も発生しそうなので、spawn しなくてもユーザー視点では同じように動作するように実装を変えて対応した。

Tagged with: ,
Posted in python, Windows

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: