=================================================== 69:ログメッセージをフォーマットしてロガーに渡さない =================================================== Pythonではロギングの書き方に注意が必要です。 ログメッセージを :index:`フォーマット` してからログに残していませんか? 具体的な失敗 =============== .. code:: python import logging logger = logging.getLogger(__name__) def main(): items = load_items() logger.info(f"Number of Items: {len(items)}") ロガーにログメッセージを渡すときは、フォーマットしてはいけません。 Pythonの `f""` を使って文字列をフォーマットするのは便利ですが、ロギングのときは使わないでください。 ベストプラクティス ================== ログのフォーマットにするときは以下のように、フォーマットせずに使いましょう。 .. code:: python def main(): items = load_items() logger.info("Number of Items: %s", len(items)) フォーマットしてロガーに渡さない理由は、ログを運用する際にメッセージ単位で集約することがあるからです。 たとえば :index:`Sentry` はログのメッセージ単位で集約して、同一の原因のログを集約、特定します。 ここで事前にフォーマットしてしまうと、全く別々のログメッセージと判断されてしまいます。 Pythonのロギングは内部的に「メッセージ」と「引数」を分けて管理しているので、分けたままログに残すべきです。 logger.logの第一引数がメッセージ、以降はメッセージに渡される値になります。 ログメッセージを読みやすく装飾したいときは、ロガーのFormatterに設定しましょう [#loggerformat]_ 。 Formatterのstyle引数に指定するとフォーマットを指定できます。 .. [#loggerformat] https://docs.python.org/ja/3/library/logging.html#logging.Formatter .. omission:: 関連 ======== * :doc:`../ロギング/75-Sentryでエラーログを通知/監視する`