4

どのモジュールがPythonルートロガーをオーバーライドしているのかをどのように見つけることができますか?

私のDjangoプロジェクトはかなりの数の外部パッケージからインポートし、logging.basicConfigとlogging.rootセットアップのすべてのインスタンスを検索しようとしましたが、それらのほとんどはテスト中であり、特に呼び出されない限りオーバーライドしないでください。

Djangoのロギング設定はルートロガーを指定していません。

4

2 に答える 2

4

解決策は、Pythonロギングモジュールのモンキーパッチを実行することでした。スタックと出来上がりを出力するlogging.root.addHandler関数の周りにデコレータをラップしたところ、logging.getLogger()を呼び出していた犯人が見つかりました。パラメータを指定せずにgetLoggerを呼び出すと、ルートロガーが取得されます。

import logging
import sys
import traceback
def tracer(func):
    def new_func(*args, **kwargs):
        try:
            traceback.print_stack(sys.stderr)
        except:
            traceback.print_exc(sys.stderr)
        return func(*args, **kwargs)
    return new_func
old_addHandler = logging.root.addHandler
logging.root.addHandler = tracer(old_addHandler)

# run your code
于 2012-09-21T14:00:50.150 に答える
0

import logging別のロギング モジュールをインポートするという意味でしょうか。この場合、役立つモジュール/パッケージの多くの特別な属性があります__path__。印刷logging.__path__すると、Pythonがどこからインポートしているかがわかります。

于 2012-09-21T02:38:25.540 に答える