ハンドラー、フォーマッター、フィルター
ログ出力をファイル、ストリーム、カスタム出力先へ振り分けます。
「ハンドラー、フォーマッター、フィルター」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- logging モジュールの基礎
- ハンドラー、フォーマッター、フィルター
- 構造化ロギング
- pdb によるデバッグ