やりたいこと
- プログラムのロギングをしたい
- mainプログラムは自作のモジュールをインポートしている
- ロギングの対象は、自分が作ったmainプログラムとモジュール
- 引数などを活用して、ロギング対象に対するログをDEBUG、INFO、WARNINGなどのログレベルの制御をまとめて行いたい
調べたらすぐできるだろうと思ったが、思いのほか試行錯誤したのでメモ書き
たどり着いた実装
以下、要点。
- mainでhandlerをセットし、出力制御を行う。
- 各モジュールでは、loggerからログを出力し、handlerで制御を行う。
- mainで、basicConfigによる設定を行うことで、読み込むモジュール全てのloggerを取り扱う。
- basicConfigでログレベル(level)を制御すると、importしている全てのモジュールのloggerに反映されるので、Filterを併用する。
- 自分がログ制御したいloggerのみ通すFilterを設定する。
main.py
import logging
from mylib.test
class MyLoggerFilter(logging.Filter):
def filter(self, record):
return (record.name == __name__) or record.name.startswith('mylib')
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.addFilter(MyLoggerFilter())
logging.basicConfig(
handlers=[handler],
level=logging.DEBUG)
mylib.test.py
import logging
logger = logging.getLogger(__name__)