nikkie-ftnextの日記

イベントレポートや読書メモを発信

HTTPX を例に、標準ライブラリ logging によるログを loguru で出力するには

はじめに

七尾百合子さん、お誕生日 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()でルートロガーのハンドラに設定しています。

InterceptHandlerlogging.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

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_codef_backを確認できます。
(これらがどういうものなのかはピンとこず...)

終わりに

HTTPX に仕込まれたロガーのログを loguru で出力してみました。
InterceptHandlerを実装し、ルートロガーのハンドラに設定します。
loguru の書式のログ出力になること、InterceptHandlerにフィルタを設定できることを確認しました。

InterceptHandlerは inspect を使っただいぶ深いレイヤーの実装でしたが、配布はされてないんですかね?(皆さん毎回手元で実装してるんです?)
loguru って簡単に使える3と聞いていたのですが、標準ライブラリ logging との連携はだいぶ難しいことをやる必要があるんですね


  1. requests よりも推していて、いくつか記事も書いています
  2. 本記事執筆時の loguru のバージョンは 0.7.3 です
  3. Python logging made (stupidly) simple(description より)