¿Determinar si el registrador raíz está configurado en el nivel DEBUG en Python?

93

Si configuro el módulo de registro en DEBUG con un parámetro de línea de comando como este:

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

¿Cómo puedo saber más tarde si el registrador se configuró en DEBUG? Estoy escribiendo un decorador que cronometrará una función si se le pasa el indicador Verdadero, y si no se le da ningún indicador, por defecto imprime la información de tiempo cuando el registrador raíz está configurado en DEBUG.

gct
fuente
Eventualmente querrá usar algo específico en lugar de acoplarlo al registrador, como opt ["time_functions"] (que puede ser predeterminado como Verdadero / Falso basado en alguna otra opción).

Respuestas:

116
logging.getLogger().getEffectiveLevel()

logging.getLogger() sin argumentos obtiene el registrador de nivel raíz.

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

Tor Valamo
fuente
¡Excelente, gracias! Estaba haciendo algo así (excepto pasar "root" explícito a getLogger), pero lo estaba haciendo en la función init de mi decorador, antes de que el registrador se configurara para depurar: \
gct
5
Si desea el nombre del nivel, no el número, puede usar esto para convertir el número en una cadena (como 'INFO'): logging.getLevelName ()
guettli
2
@guettli, getLevelName () requiere un argumento que contenga el nivel cuya representación textual desea obtener. Así que la llamada es en realidad esta bestia: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Sería bueno tener una sintaxis más simple cuando todo lo que desea es la cadena para el nivel actual.
Trutane
Para convertir el entero de nivel al nombre: docs.python.org/3/library/logging.html#levels
EddyTheB
106

De hecho, hay uno mejor: usa el códigologging.getLogger().isEnabledFor(logging.DEBUG) . Lo encontré mientras intentaba entender qué hacer con el resultado de getEffectiveLevel().

A continuación se muestra el código que utiliza el módulo de registro.

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()
Palmadita
fuente
4
Esta debería ser la respuesta aceptada, ya que hace lo mismo con menor complejidad en tiempo de ejecución.
AndyJost
1
Si fuera un código real y no una imagen. Aún así: votado a favor.
Kaiser