Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

pythonの自作モジュールを含めたプログラムのロギングの制御について

More than 1 year has passed since last update.

やりたいこと

  • プログラムのロギングをしたい
  • 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__)

参考

calderarie
データ分析コンサルタント
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away