0Pricing
Python Academy · レッスン

ハンドラー、フォーマッター、フィルター

ログ出力をファイル、ストリーム、カスタム出力先へ振り分けます。

「ハンドラー、フォーマッター、フィルター」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

ハンドラーによるログレコードの振り分け

ハンドラーは、ログレコードをコンソール、ファイル、HTTPエンドポイントなどの宛先に送信します。1つのロガーに複数のハンドラーを設定できます。

import logging

logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)

sh = logging.StreamHandler()
logger.addHandler(sh)

logger.info("Goes to console")

StreamHandler

StreamHandlerはストリーム(デフォルトではsys.stderr)に書き込みます。標準出力に出力するにはsys.stdoutを渡します。

import logging, sys

logger = logging.getLogger("out")
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.warning("printed to stdout")

FileHandler

FileHandlerはレコードをファイルに追記します。実行ごとに上書きするにはmode="w"を使います。

import logging

logging.basicConfig(
    filename="app.log",
    filemode="a",
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("Persisted to disk")

RotatingFileHandler

ログファイルがサイズ上限を超えたときに自動でローテーションし、N個のバックアップファイルを保持します。

from logging.handlers import RotatingFileHandler
import logging

handler = RotatingFileHandler(
    "app.log", maxBytes=1_000_000, backupCount=5
)
logging.getLogger().addHandler(handler)

TimedRotatingFileHandler

日単位、週単位、時間単位など、時間のスケジュールに従ってログファイルをローテーションします。長時間稼働するサービスに適しています。

from logging.handlers import TimedRotatingFileHandler
import logging

handler = TimedRotatingFileHandler(
    "app.log", when="midnight", backupCount=7
)
logging.getLogger().addHandler(handler)

フォーマッター

Formatterは各ログレコードのテキストレイアウトを制御します。handler.setFormatter()でハンドラーに設定します。

import logging

fmt = logging.Formatter(
    fmt="%(asctime)s %(levelname)-8s %(name)s — %(message)s",
    datefmt="%Y-%m-%dT%H:%M:%S"
)
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)

ハンドラーレベルのフィルタリング

各ハンドラーには独自のレベルがあります。レコードが出力されるには、ロガーのレベルとハンドラーのレベルの両方を通過する必要があります。

import logging

logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG)   # logger passes DEBUG+

err_handler = logging.FileHandler("errors.log")
err_handler.setLevel(logging.ERROR)  # only ERROR+
logger.addHandler(err_handler)

カスタムフィルター

logging.Filterをサブクラス化し、filter(record)をオーバーライドすると、任意の基準でレコードを受け入れたり拒否したりできます。

import logging

class SensitiveFilter(logging.Filter):
    def filter(self, record):
        return "password" not in record.getMessage().lower()

handler = logging.StreamHandler()
handler.addFilter(SensitiveFilter())
logging.getLogger().addHandler(handler)

フィルターによる追加フィールドの付与

フィルターは、フォーマット処理の前にレコードを変更して、追加フィールド(リクエストIDなど)を注入することもできます。

import logging

class RequestIDFilter(logging.Filter):
    def __init__(self, request_id):
        self.request_id = request_id
    def filter(self, record):
        record.request_id = self.request_id
        return True

# fmt: "%(request_id)s %(message)s"

1つのロガーに複数のハンドラーを設定する

複数のハンドラーを追加すると、同じログレコードを複数の宛先に同時に送信できます。

import logging

logger = logging.getLogger("multi")
logger.addHandler(logging.StreamHandler())             # console
logger.addHandler(logging.FileHandler("audit.log"))   # file
logger.setLevel(logging.INFO)
logger.info("Both destinations receive this")

伝播の無効化

logger.propagate = Falseを設定すると、レコードがルートロガーまで伝播して二重に記録されるのを防げます。

import logging

logger = logging.getLogger("mylib")
logger.propagate = False   # stays here, does not reach root
logger.addHandler(logging.StreamHandler())

クイックチェック

FormatterをHandlerに設定するメソッドはどれですか。

まとめ

ハンドラーはレコードを振り分け、フォーマッターは形式を整え、フィルターはレコードを選択的に通過または遮断します。サイズ制限によるログのローテーションにはRotatingFileHandlerを、日付に基づくローテーションにはTimedRotatingFileHandlerを使います。

よくある質問

「ハンドラー、フォーマッター、フィルター」レッスンは無料ですか?

はい。「ハンドラー、フォーマッター、フィルター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「ハンドラー、フォーマッター、フィルター」で何を学びますか?

ログ出力をファイル、ストリーム、カスタム出力先へ振り分けます。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ハンドラー、フォーマッター、フィルター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. logging モジュールの基礎
  2. ハンドラー、フォーマッター、フィルター
  3. 構造化ロギング
  4. pdb によるデバッグ
← Python Academyに戻る