Determinando se o logger root está definido para o nível DEBUG em Python?

92

Se eu definir o módulo de registro para DEBUG com um parâmetro de linha de comando como este:

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

Como posso saber mais tarde se o logger foi definido como DEBUG? Estou escrevendo um decorador que cronometrará uma função se o sinalizador True for passado para ela, e se nenhum sinalizador for fornecido, o padrão é imprimir informações de tempo quando o logger raiz é definido como DEBUG.

gct
fonte
Eventualmente, você desejará usar algo específico em vez de acoplá-lo ao logger, como opt ["time_functions"] (que você pode usar como padrão True / False com base em alguma outra opção).

Respostas:

114
logging.getLogger().getEffectiveLevel()

logging.getLogger() sem argumentos obtém o logger de nível raiz.

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

Tor Valamo
fonte
Excelente, obrigado! Eu estava fazendo algo assim (exceto passar "root" explícito para getLogger), mas estava fazendo isso na função init do meu decorador, antes que o logger fosse definido para depurar: \
gct
5
Se você quiser o nome do nível, não o número, pode usar isso para converter o número em uma string (como 'INFO'): logging.getLevelName ()
guettli
2
@guettli, getLevelName () requer um argumento contendo o nível cuja representação textual você deseja obter. Assim, a chamada é realmente esta besta: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Seria bom ter uma sintaxe mais simples quando tudo o que você deseja é a string para o nível atual.
Trutane
Para converter o número inteiro de nível para o nome: docs.python.org/3/library/logging.html#levels
EddyTheB
103

Na verdade, há um melhor: use o códigologging.getLogger().isEnabledFor(logging.DEBUG) . Eu descobri enquanto tentava entender o que fazer com o resultado de getEffectiveLevel().

Abaixo está o código que o próprio módulo de registro usa.

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()
Pat
fonte
4
Essa deve ser a resposta aceita, pois faz a mesma coisa com menor complexidade de tempo de execução.
AndyJost
1
Se fosse um código real e não uma imagem. Ainda assim: voto positivo.
kaiser