ログハンドラ

Rich は、Python のロギングモジュールによって書き込まれたテキストを、フォーマットして色付けする ログハンドラ を提供します。

リッチロガーを設定する例を次に示します。

import logging
from rich.logging import RichHandler

FORMAT = "%(message)s"
logging.basicConfig(
    level="NOTSET", format=FORMAT, datefmt="[%X]", handlers=[RichHandler()]
)

log = logging.getLogger("rich")
log.info("Hello, World!")

リッチログは、コンソールマークアップ にリテラルの大かっこをエスケープする必要があることを知らないライブラリが多いので、デフォルトではロギングの コンソールマークアップ をレンダリングしません。ただし、ハンドラで markup=True を設定することで有効にすることができます。あるいは、次のように extra 引数を指定することで、ログメッセージごとに有効にすることができます。

log.error("[bold red blink]Server is shutting down![/]", extra={"markup": True})

同様に、ハイライターはログメッセージごとに上書きできます。

log.error("123 will not be highlighted", extra={"highlighter": None})

例外処理

RichHandler クラスは、組み込み例外よりも多くのコンテキストを提供する、Rich の Traceback クラスを使用して例外をフォーマットするように構成できます。ログ内の見栄えの良い例外を取得するには、ハンドラコンストラクタで rich_tracebacks=True を設定します。

import logging
from rich.logging import RichHandler

logging.basicConfig(
    level="NOTSET",
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True)]
)

log = logging.getLogger("rich")
try:
    print(1 / 0)
except Exception:
    log.exception("unable print!")

詳しくは、RichHandler リファレンスをご覧ください。他にもロギング出力を構成するために使用できるオプションがいくつかあります。

フレームの抑制

フレームワーク(click、django など)で作業している場合、トレースバック内で独自のアプリケーションからのコードのみを見たい場合があります。フレームワークコードを除外するには、モジュールまたは str パスのリストである TracebackinstallConsole.print_exceptionsuppress 引数を設定します。

以下は、リッチ例外から click を除外する方法です。

import click
import logging
from rich.logging import RichHandler

logging.basicConfig(
    level="NOTSET",
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True, tracebacks_suppress=[click])]
)

抑制されたフレームには、コードなしで行とファイルのみが表示されます。