2011-07-07 17 views
30

をどのように機能するかをこの例があります:私はLoggerのために、二回logging.DEBUGにレベルを設定し、StreamHandlerのため必要があるのはなぜログでsetLevel、それは<a href="http://docs.python.org/dev/howto/logging.html" rel="noreferrer">logging howto documentation</a>で

import logging 

# create logger 
logger = logging.getLogger('simple_example') 
logger.setLevel(logging.DEBUG) 

# create console handler and set level to debug 
ch = logging.StreamHandler() 
ch.setLevel(logging.DEBUG) 

# create formatter 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 

# add formatter to ch 
ch.setFormatter(formatter) 

# add ch to logger 
logger.addHandler(ch) 

私はch.setLevel(logging.DEBUG)がストリームハンドラのデバッグレベルを設定することを理解しています。しかし、効果はロガーにレベルを設定することですか?このレベルはどこに反映されていますか?

レベルをたとえばINFOに変更すると、LoggerまたはStreamHandlerのいずれかにコンソール出力が表示されます。

です:

........... 
logger.setLevel(logging.INFO) 
............ 
ch.setLevel(logging.DEBUG) 

は(あなたが複数のハンドラを持つことができ、それぞれが異なるレベルが設定されている可能性が)それは微調整のためにあります

........... 
logger.setLevel(logging.DEBUG) 
............ 
ch.setLevel(logging.INFO) 

答えて

34

よりも、コンソールで同じ出力を提供します - ハンドラのレベルを安全に設定することはできません。これにより、すべてのメッセージ(NOTSETレベル)を処理し、レベルフィルタをロガーに残します。

ロガーはレベルに基づいてメッセージをフィルタリングする最初のものです - ロガーをINFOに設定し、すべてのハンドラをDEBUGに設定しても、ハンドラでDEBUGメッセージを受け取ることはありません。ロガー自体。ロガーがDEBUGに設定されているが、すべてのハンドラーがINFOに設定されていると、DEBUGメッセージも受信されません。ロガーが「ok、process this」と表示しているので、ハンドラーはそれを拒否します。

2

私が思うには、ロギングがどのように機能するかを理解するには、これらの主要な三点を考慮することが有用である:

  • あなたはLoggerオブジェクトの階層構造を構築することができます。それぞれは、最初に にレベルセット(レベルNOTSET)がありません。 Loggerオブジェクトの有効レベルは(何のレベルが 設定されていない場合、おそらくNOTSET)がルートロガーまで途中階層 に設定されている最初のレベルです。

  • Loggerの有効レベルは、というメッセージでその動作を開始するかどうかを決定するためにのみ使用されます。は、そのロガーに放出されます。

  • すなわちアクションは、最初、そのロガーのハンドラ、 及び第二にメッセージを渡すに祖先の鎖のハンドラのそれぞれに渡し、(の値に応じフラグを伝播されます)チェーン内のロガーのそれぞれの実際のレベルを考慮に入れずに、トップに戻ります。

質問に答えるには、その例で2回設定する必要はありません。これをLoggerのDEBUGに設定するだけで、Loggerインスタンスに直接送信されるログメッセージがコンソールに送られるようになります(新しいStreamHandlerのデフォルトレベルはデフォルトでNOTSETなので、すべて通過させるためです)。

3

レベルをlogging.DEBUGに2回、ロガーに2回、ストリームハンドラに設定する理由は何ですか?私はch.setLevel(logging.DEBUG)がストリームハンドラのデバッグレベルを設定することを理解しています。しかし、レベルをロガーに設定するのはどのような効果ですか?このレベルはどこに反映されていますか?

。これはドキュメントに示されている:

だけロガーオブジェクトのように「でsetLevel()メソッドは、適切な宛先にディスパッチされる最低の重大度を指定する理由は、(二でsetLevelあります)。メソッド?ロガーに設定されたレベルは、ハンドラに渡すメッセージの重大度を決定します。各ハンドラで設定されたレベルによって、ハンドラが送信するメッセージが決まります。

ハンドラーのチェック:http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial

関連する問題