12.9 エラーメッセージのロギング
プログラムの動作状況を記録する際、print() を使う段階から卒業し、専用の「ログ」を活用するようにしましょう。ログにはタイムスタンプやユーザー名などの情報を付加でき、障害発生時の原因究明に非常に役立ちます。
12.9.1 logging モジュールの基本コンセプト
Section titled “12.9.1 logging モジュールの基本コンセプト”Pythonの logging モジュールは、以下の要素で構成されています。
- メッセージ: 保存したいテキスト内容。
- 優先順位レベル: ランク付けのための5つのレベル。
- ロガー: 通信の主要な窓口となるオブジェクト。
- ハンドラ: メッセージを端末やファイル、メールなどに送る担当者。
- フォーマッタ: 出力される見た目を整えるもの。
12.9.2 優先順位レベル
Section titled “12.9.2 優先順位レベル”以下の5つのレベルが用意されており、それぞれ対応する関数があります。
import logging
# デフォルトでは WARNING 以上のレベルのみが表示されるlogging.debug("Looks like rain") # 表示されないlogging.info("And hail") # 表示されないlogging.warning("Did I hear thunder?") # WARNING:root:Did I hear thunder?logging.error("Was that lightning?") # ERROR:root:Was that lightning?logging.critical("Stop fencing!") # CRITICAL:root:Stop fencing!レベルの設定 (basicConfig)
Section titled “レベルの設定 (basicConfig)”デフォルトのしきい値は WARNING ですが、basicConfig() を使うと DEBUG(すべて表示)などに変更できます。
import logging# すべてのレベルをログに記録するように設定logging.basicConfig(level=logging.DEBUG)logging.debug("It's raining again") # 表示されるようになる12.9.3 ロガーオブジェクトとハンドラ
Section titled “12.9.3 ロガーオブジェクトとハンドラ”特定の名前を持つ「ロガーオブジェクト」を作成することで、ログの階層管理が可能になります。また、filename 引数を指定すると、画面ではなくファイルにログを保存できます。
import logging
# ログを 'blue_ox.log' というファイルに書き込む設定logging.basicConfig(level='DEBUG', filename='blue_ox.log')
# 'bunyan' という名前のロガーを作成logger = logging.getLogger('bunyan')
logger.debug("Where's my axe?")logger.warning("I need my axe")ファイルには以下のように記録されます。
DEBUG:bunyan:Where's my axe?WARNING:bunyan:I need my axe12.9.4 フォーマッタによるカスタマイズ
Section titled “12.9.4 フォーマッタによるカスタマイズ”format 文字列を指定することで、日時の追加や表示項目の順序を自由に変更できます。
import logging
# 書式を指定# asctime: 日時, levelname: レベル名, lineno: 行番号, message: 本文fmt = '%(asctime)s %(levelname)s %(lineno)s %(message)s'logging.basicConfig(level='DEBUG', format=fmt)
logger = logging.getLogger('bunyan')logger.error("Where's my other plaid shirt?")出力例:
2014-04-08 23:13:59,899 ERROR 1 Where's my other plaid shirt?