69:ログメッセージをフォーマットしてロガーに渡さない

Pythonではロギングの書き方に注意が必要です。 ログメッセージを フォーマット してからログに残していませんか?

具体的な失敗

import logging

logger = logging.getLogger(__name__)


def main():
    items = load_items()
    logger.info(f"Number of Items: {len(items)}")

ロガーにログメッセージを渡すときは、フォーマットしてはいけません。 Pythonの f"" を使って文字列をフォーマットするのは便利ですが、ロギングのときは使わないでください。

ベストプラクティス

ログのフォーマットにするときは以下のように、フォーマットせずに使いましょう。

def main():
    items = load_items()
    logger.info("Number of Items: %s", len(items))

フォーマットしてロガーに渡さない理由は、ログを運用する際にメッセージ単位で集約することがあるからです。 たとえば Sentry はログのメッセージ単位で集約して、同一の原因のログを集約、特定します。 ここで事前にフォーマットしてしまうと、全く別々のログメッセージと判断されてしまいます。

Pythonのロギングは内部的に「メッセージ」と「引数」を分けて管理しているので、分けたままログに残すべきです。 logger.logの第一引数がメッセージ、以降はメッセージに渡される値になります。

ログメッセージを読みやすく装飾したいときは、ロガーのFormatterに設定しましょう 1 。 Formatterのstyle引数に指定するとフォーマットを指定できます。

1

https://docs.python.org/ja/3/library/logging.html#logging.Formatter

cover

(中略)詳細は書籍 自走プログラマー をご参照ください

関連