1. ホーム
  2. python

PythonのロギングハンドラでsetLevelのポイントは何ですか?

2023-11-07 13:34:14

質問

例えば、以下のようなコードがあるとします。

import logging
import logging.handlers

a = logging.getLogger('myapp')
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)

# The effective log level is still logging.WARN
print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

を設定することが期待されます。 logging.DEBUG を設定することで、デバッグレベルのメッセージがログファイルに書き込まれることを期待します。しかし、これは有効なレベル (例えば logging.WARNING と等しい)、ログに記録されるのは warn メッセージのみをログファイルに記録し、デバッグメッセージは記録しません。

ハンドラのログ レベルは床に落とされているように見えますが、たとえば黙って無視されています。そこで疑問に思うのですが、なぜ setLevel をつける必要があるのでしょうか?

どのように解決するのですか?

より細かい制御が可能になります。デフォルトでは、ルートロガーは WARNING レベルが設定されています。これは、より低いレベルのメッセージを表示しないことを意味します (ハンドラのレベルがどのように設定されているかに関係なく!)。しかし、もしルートロガーのレベルを DEBUG に設定すると、確かにメッセージはログファイルに送信されます。

import logging
import logging.handlers

a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG)   # set root's level
h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)
print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

さて、デバッグ情報を記録しない新しいハンドラを追加したい場合を想像してください。 これは、ハンドラのロギングレベルを設定することで実現できます。

import logging
import logging.handlers

a = logging.getLogger('myapp')
a.setLevel(logging.DEBUG)   # set root's level

h = logging.handlers.RotatingFileHandler('foo.log')
h.setLevel(logging.DEBUG)
a.addHandler(h)

h2 = logging.handlers.RotatingFileHandler('foo2.log')
h2.setLevel(logging.WARNING)
a.addHandler(h2)

print a.getEffectiveLevel() 
a.debug('foo message')
a.warn('warning message')

さて、ログファイル foo.log には両方のメッセージが含まれ、一方、ファイル foo2.log には警告メッセージだけが含まれます。エラーレベルメッセージのみのログファイルに興味がある場合は、 単に Handler を追加し、そのレベルを logging.ERROR を使用し、すべて同じ Logger .

を思い浮かべるかもしれません。 Logger ロギングレベルは、与えられたロガーに対してどのメッセージが "興味深いものであるかについてのグローバルな制限として考えることができます。 とそのハンドラ . ロガーによって考慮されるメッセージは 以後 はハンドラに送られ、ハンドラは独自のフィルタリングとロギング処理を実行します。