Python logging.config.listenを使用して、動的にログの設定内容を変更する

Pythonのloggingについて調べてます。

Python loggingモジュールの基本的な使い方
Python logging 各種出力ハンドラーの使い方について
Python logging 複数のロガー、ハンドラーの使用方法
Python logging 設定ファイルによるログ出力の設定


マニュアルを見ていると、
15.8.1. 環境設定のための関数
logging.config.listenを使用すれば、動的にログの出力設定が
変更できるようでしたので、簡単なプログラムを書いてみました。




待ち受けサーバーとログ出力プログラム



logging.config.listenを使用して、ログの設定変更を待ち受け、
ログの出力を行うプログラムはこんな感じになりました。


  1. # -*- coding:utf-8 -*-
  2. import time
  3. import logging.config
  4. #12345ポートで、設定ファイルの変更を待ち受ける
  5. t = logging.config.listen(12345)
  6. t.start()
  7. t.ready.wait()
  8. log = logging.getLogger()
  9. while(True):
  10.     #5秒待って、debugとerrorログを出力
  11.     time.sleep(5)
  12.     log.debug("debugメッセージ")
  13.     log.error("errorメッセージ")
  14. logging.config.stopListening()
  15. t.join(2.0)




ひとつのコンソールでプログラムを実行しておきます。
※ちなみに、このプログラムは無限ループを作っているので閉じるボタンで
終了する必要があります。


logging.config.listenで待ち受けているポートに対し、ログの設定を
送り込むプログラムは以下の通り。


  1. # -*- coding:utf-8 -*-
  2. import sys
  3. import socket
  4. import struct
  5. text = """
  6. [loggers]
  7. keys=root
  8. [handlers]
  9. keys=consoleHandler
  10. [formatters]
  11. keys=simpleFormatter
  12. [logger_root]
  13. level=__DEBUGLEVEL__
  14. handlers=consoleHandler
  15. [handler_consoleHandler]
  16. class=StreamHandler
  17. level=DEBUG
  18. formatter=simpleFormatter
  19. args=(sys.stdout,)
  20. [formatter_simpleFormatter]
  21. format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
  22. datefmt=
  23. """
  24. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  25. sock.settimeout(2.0)
  26. sock.connect(('localhost', 12345))
  27. #デバッグレベルを引数の値に指定
  28. text = text.replace('__DEBUGLEVEL__', sys.argv[1])
  29. slen = struct.pack('>L', len(text))
  30. s = slen + text
  31. sentsofar = 0
  32. left = len(s)
  33. while left > 0:
  34.     sent = sock.send(s[sentsofar:])
  35.     sentsofar += sent
  36.     left -= sent
  37. sock.close()




引数で取った値にログレベルを変更することを想定しています。






実行してみる




上がlogging.config.listenを起動しているプログラム。
下が設定変更を行うプログラムです。

34_001_20120102154715.png


34_002_20120102154715.png



最初はログの設定が何も行われていない状態なので、

No handlers could be found for logger "root"


というメッセージが表示されています。


設定変更用のプログラムを実行し、ログレベルをDEBUGに設定します。

$ python client.py DEBUG




すると、DEBUGとERRORのログが出力され始めます。

途中で

$ python client.py ERROR


を実行して、ログレベルを変更するとERRORログのみ表示されるようになりました。



再度

$ python client.py DEBUG


を実行してDEBUGに戻すと、またDEBUGとERRORログが出力されるようになりました。




Webアプリケーションなど、停止するのが難しいアプリケーションのログレベルを
動的に変更したい場合に使えるかもしれません。





関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ