どのモジュールがPythonルートロガーをオーバーライドしているのかをどのように見つけることができますか?
私のDjangoプロジェクトはかなりの数の外部パッケージからインポートし、logging.basicConfigとlogging.rootセットアップのすべてのインスタンスを検索しようとしましたが、それらのほとんどはテスト中であり、特に呼び出されない限りオーバーライドしないでください。
Djangoのロギング設定はルートロガーを指定していません。
解決策は、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
import logging
別のロギング モジュールをインポートするという意味でしょうか。この場合、役立つモジュール/パッケージの多くの特別な属性があります__path__
。印刷logging.__path__
すると、Pythonがどこからインポートしているかがわかります。