1. ホーム
  2. python

[解決済み] Python Logging - インポートモジュールからのロギングを無効にする

2022-04-27 22:36:13

質問

Pythonのloggingモジュールを使っていますが、インポートしたサードパーティーモジュールが出力するログメッセージを無効にしたいのですが、どうすればいいですか? 例えば、以下のようなものを使っています。

logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)

これは logger.debug("my message!") を実行したときに私のデバッグメッセージを出力しますが、私がインポートしたすべてのモジュール (リクエストや他の多くのもの) からのデバッグメッセージも出力します。

興味のあるモジュールのログメッセージだけを見たいのですが。 loggingモジュールにこれをさせることは可能でしょうか?

理想的には、"ModuleX, ModuleY" からのメッセージを表示し、その他は無視するようにロガーに指示できるようにしたいのですが、可能ですか?

下記を見ましたが、インポートされた関数を呼び出す前に毎回ロギングを無効化/有効化する必要があるのは困ります。 logging - インポートモジュールのログを無視する方法は?

解決方法は?

問題は getLogger を引数なしで返します。 ルート ロガーに設定されます。 logging.DEBUG は、そのロガーを使用する他のモジュールのレベルも設定することになります。

これを解決するには、単純に ない はルートロガーを使用しています。これを行うには、単に引数として名前を渡します。例えば、モジュールの名前などです。

logger = logging.getLogger('my_module_name')
# as before

これは新しいロガーを作成するので、他のモジュールのロギングレベルを不注意に変更することはありません。


当然ながら logger.debug の代わりに logging.debug を呼び出す便利な関数なので、後者は debug メソッドを使用します。

に記載されています。 ロギング上級者向けチュートリアル . また、どのモジュールがログメッセージをトリガーしたかを簡単に知ることができます。