2012-03-07 5 views
3

ファイルを読み込んでfileConfigオプションを使用して、main.pyにPythonロギングを設定しています。私は、テストとライブロギングの設定を切り替えることができるようにしたいので、まず別の設定ファイルを読み込み、そこからロギング設定ファイルのパスを抽出します。ロギング設定によるインポート時ロガーのネーミングと互換性がない

私がmain.pyからインポートした他のファイルは、log = getLogger(__name__)で自分のロガーを取得していますが、これはインポート時に発生します。新しい設定がロードされると、これらのリンクが壊れてしまい、これらのモジュールは予期したとおりに動作しなくなります。

多くのリファクタリングをしなくても、これらのモジュールのインポートを簡単に遅延させることはできません。後でログ設定でロードしながらモジュール名でロガーを設定する方法はありますか?

+0

設定ファイルを読み込む前に、すでに初期化されているロガーの 'handlers'属性を調べてみましょう(空リストの割り当てなど)。 – jcollado

答えて

2

どのように物事が壊れているのか正確にはわかりませんが、私はそれを見ています。 log = logging.getLogger(__name__)を実行するさまざまなモジュールは、実際にモジュールを他のパッケージの場所に移動しない限り、ロガーの有効な名前(logger name = package name)を持ちます。

インポート時に、ロギング設定が設定されている場合と設定されていない場合があります。インポートの副作用として実際にロギングを行うべきではありません(存在する場合は、 )。 fileConfigを使用して、新しいコンフィギュレーションをロード

は、一般的にちょうどロガーのハンドラ、フォーマッタとレベルを設定します。あなたは、その後、インポートモジュール内のコードを呼び出すとき

、彼らはあなたの以前の設定の呼び出しによって取り付けハンドラを持っている彼らのロガーを介してログインする - ので、構成に応じて出力されます。

あなたは、Pythonの古いバージョン(< = 2.5)に、不可避的な構成で指定されていなかった既存のロガーを無効になりfileConfigに呼び出すことに注意する必要があります - これは、(2.6> =)はPythonの最近のバージョンでfileConfigに渡されたdisable_existing_loggers=Falseキーワード引数を使用して設定できます。これは、予期しない動作につながることがあります(古いPythonバージョンの動作との互換性のために、そのパラメータのデフォルトはTrueです)。

壊れていると思われるものについて詳細を投稿すると、何が起こっているのかをより正確に診断できます。

+1

これは 'disable_existing_loggers'問題でした。私はそのパラメータに気付かず、以前に割り当てられたロガーをすべて切っていました。 – Kylotan

関連する問題