logging(logger) ログ出力 その3

ロガーの階層

前回の続きでロガーについてです。ロガーオブジェクトにはそれぞれに名前が定義されているのですが、この名前はドットをセパレータとした階層構造を定義できます。例えば、carという名前のロガーはcar.engineというロガーの親となります。前のページでも説明しましたが、ロガーの名前はgetLoggerの引数で指定することができます。サンプルを見てみましょう。

import logging

# ロガー1を取得
logger1 = logging.getLogger('parent')
logger1.setLevel(logging.DEBUG)

# ハンドラー1を作成する
h1 = logging.StreamHandler()
h1.setLevel(logging.DEBUG)

# ハンドラー1にフォーマッターを設定する
h1.setFormatter(logging.Formatter('フォーマット1 %(message)s'))

# ロガー1にハンドラー1を設定する
logger1.addHandler(h1)

# 2個めのロガー。ロガー2を取得。ハンドラーは設定しない。 
logger2 = logging.getLogger('parent.childe')

# 出力 
logger2.error('エラーメッセージ')

親子関係にあるロガー1とロガー2がありますが、ロガー2にはハンドラーを設定していないにもかかわらず、ロガー1に設定したハンドラの設定が効いています。これはロガー1の名前がparentで、ロガー2の名前がparent.childeで親子関係にあるためです。また、子ロガーに対してaddHandlerすることにより、特定モジュールの処理だけ重点的に別途ログ出力をすることができます。

ロガーの階層構造のトップは、ルートロガーと呼ばれ、ログ出力ではrootと表示されます。ルートロガーを取得する場合はgetLoggerで空文字列を指定します。(rootという名前でロガーを取得しても、ルートロガーは取得できないので注意してください。)ルートロガーは全てのロガーの親なので、ここに設定した内容は全てのロガーに反映されます。