Feststellen, ob der Root-Logger in Python auf DEBUG-Ebene eingestellt ist?

92

Wenn ich das Protokollierungsmodul mit einem Befehlszeilenparameter wie diesem auf DEBUG setze:

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

Wie kann ich später feststellen, ob der Logger auf DEBUG eingestellt war? Ich schreibe einen Dekorateur, der eine Funktion zeitlich festlegt, wenn das True-Flag an ihn übergeben wird. Wenn kein Flag angegeben wird, werden standardmäßig Zeitinformationen gedruckt, wenn der Root-Logger auf DEBUG gesetzt ist.

gct
quelle
Möglicherweise möchten Sie etwas Bestimmtes verwenden, anstatt dies mit dem Logger zu koppeln, z. B. opt ["time_functions"] (basierend auf einer anderen Option können Sie standardmäßig True / False verwenden).

Antworten:

114
logging.getLogger().getEffectiveLevel()

logging.getLogger() ohne Argumente erhält der Root Level Logger.

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

Tor Valamo
quelle
Großartig, danke! Ich habe so etwas gemacht (außer explizites "root" an getLogger zu übergeben), aber ich habe es in der init- Funktion meines Dekorateurs gemacht, bevor der Logger auf Debug gesetzt wurde: \
gct
5
Wenn Sie den Namen der Ebene und nicht die Nummer möchten, können Sie damit die Nummer in eine Zeichenfolge konvertieren (wie 'INFO'): logging.getLevelName ()
guettli
2
@guettli, getLevelName () erfordert ein Argument, das die Ebene enthält, deren Textdarstellung Sie erhalten möchten. Der Ruf ist also eigentlich dieses Biest : logging.getLevelName(logging.getLogger().getEffectiveLevel()). Es wäre schön, eine einfachere Syntax zu haben, wenn Sie nur die Zeichenfolge für die aktuelle Ebene wünschen.
Trutane
So konvertieren Sie die Ganzzahl der Ebene in den Namen: docs.python.org/3/library/logging.html#levels
EddyTheB
103

Eigentlich gibt es eines besser: Verwenden Sie den Codelogging.getLogger().isEnabledFor(logging.DEBUG) . Ich habe es gefunden, als ich versucht habe zu verstehen, was ich mit dem Ergebnis von anfangen soll getEffectiveLevel().

Unten finden Sie den Code, den das Protokollierungsmodul selbst verwendet.

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()
Klopfen
quelle
4
Dies sollte die akzeptierte Antwort sein, da dies bei geringerer Laufzeitkomplexität dasselbe tut.
AndyJost
1
Wenn es tatsächlicher Code und kein Bild wäre. Trotzdem: positiv bewertet.
Kaiser