はじめに
七尾百合子さん、お誕生日 192日目 おめでとうございます! nikkieです。
標準ライブラリの logging を使うことが多い私ですが、awesome なロギングライブラリの1つである loguru を使ったらどうなるのか、手を動かしてみました。
目次
HTTPX の Guide「logging」
HTTP クライアントライブラリの1つ、HTTPX1。
ドキュメントの Guides にはロギングを扱った項目もあります。
import logging logging.basicConfig( format="%(levelname)s [%(asctime)s] %(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG )
logging.basicConfig() でルートロガーをDEBUG
レベルに設定し、httpx
ロガー(やhttpcore
ロガー)からのpropagate を使ってロギングしています。
HTTPX の実装では logging.getLogger("httpx")
してロギングしているのですが、では loguru を使った場合はどう実装するのでしょうか?
loguru
vinta/awesome-python の Logging より
loguru - Library which aims to bring enjoyable logging in Python.
README の Features の中にあります2。
Entirely compatible with standard logging
InterceptHandler を実装し、ルートロガーに設定する
InterceptHandler
を実装して、basicConfig()
でルートロガーのハンドラに設定しています。
InterceptHandler
はlogging.Handler
を継承し、emit()
メソッドを実装。
https://docs.python.org/ja/3/library/logging.html#logging.Handler.emit
指定されたログ記録レコードを実際にログ記録する際のすべての処理を行います。
これでhttpx
ロガーやhttpcore
ロガーによるロギングが loguru で出力されます。
basicConfig()
のformat
引数を与えても loguru のフォーマットのままでした。
InterceptHandler
にフィルタを設定して、httpx
ロガーによるログだけにできています(コメントアウト部分)
ドキュメント確認メモ
loguru の Logger
from loguru import logger
する logger は Logger クラスのインスタンスです。
https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger
log()
でレベルとメッセージを与えてロギングlevel()
は loguru のロギングレベルの取得opt()
: loguru の Logger にロギングのパラメタを与えています(今回はdepth
・exception
を指定)- https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.opt
Parametrize a logging call to slightly change generated log message.
inspect
inspect.currentframe()
https://docs.python.org/ja/3/library/inspect.html#inspect.currentframe
呼び出し元のフレームオブジェクトを返します。
フレームオブジェクト
https://docs.python.org/ja/3/reference/datamodel.html#frame-objects
f_code
、f_back
を確認できます。
(これらがどういうものなのかはピンとこず...)
終わりに
HTTPX に仕込まれたロガーのログを loguru で出力してみました。
InterceptHandler
を実装し、ルートロガーのハンドラに設定します。
loguru の書式のログ出力になること、InterceptHandler
にフィルタを設定できることを確認しました。
InterceptHandler
は inspect を使っただいぶ深いレイヤーの実装でしたが、配布はされてないんですかね?(皆さん毎回手元で実装してるんです?)
loguru って簡単に使える3と聞いていたのですが、標準ライブラリ logging との連携はだいぶ難しいことをやる必要があるんですね