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引数に指定するとフォーマットを指定できます。
(中略)詳細は書籍 自走プログラマー をご参照ください