Pythonでルートロガーがデバッグレベルに設定されているかどうかを確認していますか?


92

次のようなコマンドラインパラメータを使用して、ロギングモジュールをデバッグに設定した場合:

if (opt["log"] == "debug"):
  logging.basicConfig(level=logging.DEBUG)

ロガーがDEBUGに設定されているかどうかを後で確認するにはどうすればよいですか?Trueフラグが渡された場合に関数の時間を計測するデコレータを作成しています。フラグが指定されていない場合、ルートロガーがDEBUGに設定されていると、デフォルトでタイミング情報が出力されます。


これをロガーに結合する代わりに、opt ["time_functions"](他のオプションに基づいてデフォルトでTrue / Falseになる可能性がある)などの特定の何かを最終的に使用する必要があります。

回答:


114
logging.getLogger().getEffectiveLevel()

logging.getLogger() 引数なしでルートレベルのロガーを取得します。

http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel


すばらしい、ありがとう!私はそのようなことをしていましたが(getLoggerに明示的な「ルート」を渡すことを除いて)、ロガーがdebugに設定される前に、デコレータのinit関数でそれを行っていました:\
gct

5
数値ではなくレベルの名前が必要な場合は、これを使用して数値を文字列(「INFO」など)に変換できます
。logging.getLevelName

2
@ guettli、getLevelName()には、テキスト表現を取得するレベルを含む1つの引数が必要です。したがって、呼び出しは実際にはこの獣です:logging.getLevelName(logging.getLogger().getEffectiveLevel())。現在のレベルの文字列だけが必要な場合は、より単純な構文を使用すると便利です。
トゥルタン

レベル整数を名前に変換するには:docs.python.org/3/library/logging.html#levels
EddyTheB

103

実際にはもう1つ、コードを使用しますlogging.getLogger().isEnabledFor(logging.DEBUG)。の結果をどう処理するかを理解しようとしたときに、それを見つけましたgetEffectiveLevel()

以下は、ロギングモジュール自体が使用するコードです。

def getEffectiveLevel(self):
    """
    Get the effective level for this logger.

    Loop through this logger and its parents in the blogger hierarchy,
    looking for a non-zero logging level. Return the first one found. 
    """
    logger = self
    while logger:
        if logger.level:
            return logger.level
        logger = logger.parent
    return NOTSET

def isEnabledFor(self, level):
    """
    Is this logger enabled for level ‘level’?
    """
    if self.manager.disable >= level:
        return 0
    return level >= self.getEffectiveLevel()

4
これは同じことを実行時の複雑さを抑えて行うため、受け入れられる答えになるはずです。
AndyJost 2017

1
画像ではなく実際のコードである場合。それでも:賛成票を投じた。
カイザー2018

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.