2017-11-22 8 views
0

私は独自のハンドラーとフォーマットで独自のロガーをインスタンス化するコードを開発中です。Python 2ロガーは、デフォルトロガーの使用後に行を繰り返す

これで、ロギングモジュールを直接使用するライブラリを追加しました。これはロガーを壊してしまいます。元のロガーは、デフォルトのロガーが何も印刷していない間に、

提案がありますか? MCVE:

import sys 
import logging 
log = logging.getLogger('foo') 
log.addHandler(logging.StreamHandler(sys.stdout)) 
log.setLevel(logging.DEBUG) 

log.info("works once") 
logging.info("Isn't printed") 
log.info("printed twice with different format") 

出力:それはまた、デフォルトのロガーのように見えるdoesntの

works once 
printed twice with different format 
INFO:foo:printed twice with different format 

は何とか私のロガーインスタンスに追加のハンドラを追加します。

> print log.handlers 
[<logging.StreamHandler object at 0x7f5d14314990>] 

私は変更することはできません。モジュール私は含まれている...

答えて

0

掘削と掘削の後、私はついに私を救った証言!

Logger.propagate

これが真と評価された場合、イベントがこの ロガーに記録することは、これに接続されているすべてのハンドラに加えて、より高いレベル(祖先) ロガーのハンドラに渡されますロガー。メッセージ は、祖先ロガーのハンドラに直接渡されます。 レベルも問題の祖先ロガーのフィルタも考慮されません。

これがfalseに評価された場合、ロギングメッセージは祖先ロガーの ハンドラに渡されません。

コンストラクタは、この属性をTrueに設定します。

設定log.propagate = Falseは私の不幸を終わらせました。

logging.infoまでのデフォルトロガーを最初に使用すると、デフォルトのロガーが初期化され、その時点から伝播が開始されたように見えます。

+2

可能であれば、使用しているライブラリのバグレポートを開きます。ライブラリは、ロギングにルートロガーを使用しないでください。あなたが直面しているような問題を引き起こします。 ライブラリは独自のロガー( 'getLogger()')を作成し、 'NullHandler'を添付してください。 – m1keil

関連する問題