Closed10

Pythonのloggingについて

zztkmzztkm

概要

Python の logging 周辺に関する知見をまとめていくスクラップです。
こういう注意点もあるよとか、ここはこうだよとか色々意見をもらえると助かります。

更新とかの方針

  • 参考になったドキュメントや記事へのリンクを残す
  • loggingの設定などの基本的なことを学んだタイミングで残す
  • コンテンツが多くなってきたら zenn の記事にまとめる
zztkmzztkm

logging.basicConfig

デフォルトの Formatter を持つ StreamHandler を生成してルートロガーに追加し、ロギングシステムの基本的な環境設定を行います。関数 debug(), info(), warning(), error(), critical() は、ルートロガーにハンドラが定義されていない場合に自動的に basicConfig() を呼び出します。

公式ドキュメントより

使うときの注意点

  • root logger にハンドラーが既に追加されている場合は基本的に何もしない(処理がすっ飛ばされる)
    • どうしてもbasicConfigでハンドラーの設定をしたければ、引数にforce=Trueを設定すれば良い
    • force に True が設定されている場合、root logger に追加されている全てのハンドラーが全てさよならしてしまう(削除して閉じられる)
zztkmzztkm

ライブラリにおけるlogging

以下のようにライブラリを設定することが推奨されている。

import logging
logging.getLogger('foo').addHandler(logging.NullHandler())

注釈 ライブラリのロガーには、 NullHandler 以外のハンドラを追加しない ことを強く推奨します。これは、ハンドラの設定が、あなたのライブラリを使うアプリケーション開発者にも伝播するからです。アプリケーション開発者は、対象となる聴衆と、そのアプリケーションにどのハンドラが最も適しているかを知っています。ハンドラを 'ボンネットの中で' 加えてしまうと、ユニットテストをして必要に応じたログを送達する能力に干渉しかねません。

公式ドキュメントより

公式ドキュメントを読んでいると上記の注釈がある。

自分が使っているサードパーティのPythonライブラリのロガーにbasicConfigが設定されていると、自分が書いたスクリプトのbasicConfigの設定がスルーされてしまうとかいう事故が起こってしまうので気をつけたい(現象としてはこの事故を経験して、ライブラリ側のbasicConfigを外せば直ったが本当にここだけが問題だったのかは検証していないので検証してから明言する)。

zztkmzztkm

Loguru Tips

標準の logging の内容を Loguru に渡したい

https://github.com/Delgan/loguru#entirely-compatible-with-standard-logging

class InterceptHandler(logging.Handler):
    def emit(self, record):
        # Get corresponding Loguru level if it exists
        try:
            level = logger.level(record.levelname).name
        except ValueError:
            level = record.levelno

        # Find caller from where originated the logged message
        frame, depth = logging.currentframe(), 2
        while frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1

        logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())

logging.basicConfig(handlers=[InterceptHandler()], level=0)
このスクラップは2022/09/24にクローズされました