Pythonのloggingについて
概要
Python の logging 周辺に関する知見をまとめていくスクラップです。
こういう注意点もあるよとか、ここはこうだよとか色々意見をもらえると助かります。
更新とかの方針
- 参考になったドキュメントや記事へのリンクを残す
-
logging
の設定などの基本的なことを学んだタイミングで残す - コンテンツが多くなってきたら zenn の記事にまとめる
logging.basicConfig
デフォルトの Formatter を持つ StreamHandler を生成してルートロガーに追加し、ロギングシステムの基本的な環境設定を行います。関数 debug(), info(), warning(), error(), critical() は、ルートロガーにハンドラが定義されていない場合に自動的に basicConfig() を呼び出します。
公式ドキュメントより
使うときの注意点
- root logger にハンドラーが既に追加されている場合は基本的に何もしない(処理がすっ飛ばされる)
- どうしてもbasicConfigでハンドラーの設定をしたければ、引数に
force=True
を設定すれば良い - force に True が設定されている場合、root logger に追加されている全てのハンドラーが全てさよならしてしまう(削除して閉じられる)
- どうしてもbasicConfigでハンドラーの設定をしたければ、引数に
ライブラリにおけるlogging
以下のようにライブラリを設定することが推奨されている。
import logging
logging.getLogger('foo').addHandler(logging.NullHandler())
注釈 ライブラリのロガーには、 NullHandler 以外のハンドラを追加しない ことを強く推奨します。これは、ハンドラの設定が、あなたのライブラリを使うアプリケーション開発者にも伝播するからです。アプリケーション開発者は、対象となる聴衆と、そのアプリケーションにどのハンドラが最も適しているかを知っています。ハンドラを 'ボンネットの中で' 加えてしまうと、ユニットテストをして必要に応じたログを送達する能力に干渉しかねません。
公式ドキュメントを読んでいると上記の注釈がある。
自分が使っているサードパーティのPythonライブラリのロガーにbasicConfig
が設定されていると、自分が書いたスクリプトのbasicConfig
の設定がスルーされてしまうとかいう事故が起こってしまうので気をつけたい(現象としてはこの事故を経験して、ライブラリ側のbasicConfig
を外せば直ったが本当にここだけが問題だったのかは検証していないので検証してから明言する)。
Loguru
Loguruは使ってて便利だし、色もデフォルトでつけてくれるから楽しいロギングライブラリ。
@logger.catch
このデコレーターでラップされた関数でキャッチされた可能性のあるエラーを自動的にログに記録する。
Loguru Tips
標準の logging の内容を Loguru に渡したい
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)
logging を使うときの参考情報