• 2018-05-31
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/05/pythonwindows.html

Pythonでログをローテーション出来ない!!(Windows環境)

ログローテーション出来ない!!

日本一平凡なDjangoの連載でPythonのWebシステムを作っている私ですが、厄介な問題にぶち当たりました。

ログファイルをローテーション出来ないんですよ。

「logging.handlers.RotatingFileHandler」や「logging.handlers.TimedRotatingFileHandler」を使ってログローテーションを実現しようとすると、以下のようなエラーが。

ログ

[CRITICAL]      2018-05-31 17:23:41,024 start_samples.views:12  クリティカル    Thread-2
--- Logging error ---
Traceback (most recent call last):
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\logging\handlers.py", line 72, in emit
    self.doRollover()
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\logging\handlers.py", line 173, in doRollover
    self.rotate(self.baseFilename, dfn)
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\logging\handlers.py", line 113, in rotate
    os.rename(source, dest)
PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\Users\\uzu\\PycharmProjects\\heibon_django\\heibon-django.log' -> 'C:\\Users\\uzu\\PycharmProjects\\heibon_django\\heibon-django.log.1'
Call stack:
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\threading.py", line 884, in _bootstrap
    self._bootstrap_inner()
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\socketserver.py", line 639, in process_request_thread
    self.finish_request(request, client_address)
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\socketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\socketserver.py", line 696, in __init__
    self.handle()
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\servers\basehttp.py", line 154, in handle
    handler.run(self.server.get_app())
  File "c:\users\uzu\appdata\local\programs\python\python36\Lib\wsgiref\handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\contrib\staticfiles\handlers.py", line 66, in __call__
    return self.application(environ, start_response)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\wsgi.py", line 146, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\base.py", line 81, in get_response
    response = self._middleware_chain(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\utils\deprecation.py", line 95, in __call__
    response = self.get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\uzu\venv\heibon-django\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\uzu\PycharmProjects\heibon_django\start_samples\views.py", line 12, in index
    logger.critical("クリティカル")
Message: 'クリティカル'
Arguments: ()

Windows環境だけで発生する問題

こちらのサイトを拝見させて頂きました。


どうやらWindows環境だけで発生する事象のようです。


Issue with RotatingFileHandler logging handler on Windows
「Resolution: not a bug」で完結しており、どうやらバグではなく仕様という扱いになっているようです。

なんてこった。。。

対応方法としては、別途ログサーバを立てて「logging.handlers.SocketHandler」を使用しネットワーク経由でログを出力するとかいう記述がありますが、現実的に行われることは無い方法だと思います。

どうやら私が望んでいるような抜本的な解決は無さそうです。
世の中では、Pythonのシステムは基本的にLinux環境で動かすものなので、Windows環境でのみ発生するこの問題は余り本腰を入れて考えられていないのかもしれませんね。

私の場合は開発環境こそWindowsですが、本番はLinux環境を想定しています。
なので、開発環境では諦めてローテーション無しで済ませて、本番環境ではローテーションする方針で行こうと思います。

0 件のコメント:

コメントを投稿

お気軽にコメント下さい。