Determinare se il logger di root è impostato sul livello DEBUG in Python?


92

Se imposto il modulo di registrazione su DEBUG con un parametro della riga di comando come questo:

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

Come posso sapere in seguito se il logger era impostato su DEBUG? Sto scrivendo un decoratore che cronometrerà una funzione se le viene passato il flag True, e se non viene fornito alcun flag, si imposta per impostazione predefinita la stampa delle informazioni sui tempi quando il logger di root è impostato su DEBUG.


Alla fine vorrai usare qualcosa di specifico invece di accoppiarlo al logger, come opt ["time_functions"] (che potresti impostare come True / False in base a qualche altra opzione).

Risposte:


114
logging.getLogger().getEffectiveLevel()

logging.getLogger() senza argomenti ottiene il logger a livello di root.

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


Eccellente grazie! Stavo facendo qualcosa del genere (eccetto il passaggio di "root" esplicito a getLogger), ma lo stavo facendo nella funzione init del mio decoratore, prima che il logger fosse impostato per il debug: \
gct

5
Se vuoi il nome del livello, non il numero, puoi usarlo per convertire il numero in una stringa (come 'INFO'): logging.getLevelName ()
guettli

2
@guettli, getLevelName () richiede un argomento contenente il livello di cui si desidera ottenere la rappresentazione testuale. Quindi la chiamata è in realtà questa bestia: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Sarebbe bello avere una sintassi più semplice quando tutto ciò che vuoi è la stringa per il livello corrente.
Trutane

Per convertire il numero intero di livello nel nome: docs.python.org/3/library/logging.html#levels
EddyTheB

103

In realtà, ce n'è uno migliore: usa il codicelogging.getLogger().isEnabledFor(logging.DEBUG) . L'ho trovato cercando di capire cosa fare con il risultato di getEffectiveLevel().

Di seguito è riportato il codice utilizzato dal modulo di registrazione stesso.

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
Questa dovrebbe essere la risposta accettata, poiché fa la stessa cosa con una complessità di runtime inferiore.
AndyJost

1
Se fosse un codice reale e non un'immagine. Ancora: votato.
Kaiser

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.