モジュールloggingは、Pythonの標準的なログ記録ツールです。これは、ロガーの階層を実装し、ロギングレベル(severity levels)をサポートします:DEBUG、INFO、WARNING、ERROR、CRITICAL。正しい使用法により、出力を中央集権的に管理し、ログをファイルに保存し、電子メールで送信し、レベルでフィルタリングすることができます。
主なアイデアは、各モジュールで名前付きのロガーを作成すること(logging.getLogger(__name__))であり、各場所で新たにグローバルなrootロガーを作成しないことです。設定(フォーマット、ハンドラー、レベル)は、アプリケーションの起動時に中央集権的に行います。
設定の例:
import logging logging.basicConfig(format='%(levelname)s:%(name)s:%(message)s', level=logging.INFO) logger = logging.getLogger(__name__) def foo(): logger.info('情報メッセージ') logger.error('エラー!') foo()
なぜ各モジュールで
logging.basicConfig()を呼び出すことができないのですか?これを行った場合、何が起こりますか?
答え: logging.basicConfig()は、Pythonセッションの間にrootロガーを1回だけ設定します。rootロガーがすでに初期化されている場合、繰り返し呼び出すと無視されます。その結果、異なるモジュールがそれぞれのフォーマット/レベルでbasicConfig()を呼び出そうとすると、最初の1つだけが機能します!
物語
大規模なプロジェクトで、各開発者が自分の好みに応じてbasicConfigとローカルハンドラーを使ってログ記録を設定していました。その結果、一部のログが全く表示されず、他のログは10回複製され、異なるモジュールのメッセージが1つのファイルに収まらないことがありました。
物語
ウェブサービスを多段階ロギングに移行する際に、getLogger(__name__)を通じてロガーの名前を設定することを忘れ、すべてrootロガーに書き込んでいました。その結果、特定のログがどこから来たのかを特定できませんでした。
物語
logger.error()関数を使用して、すべてのメッセージ、さらにはエラーではないメッセージを記録していました。その結果、自動監視システムが常に「警報」を上げていました、なぜなら高いエラーレベルを見ていたからです、実際にはそれはただのデバッグ/情報メッセージでした。