Déterminer si l'enregistreur racine est défini sur le niveau DEBUG en Python?

92

Si je règle le module de journalisation sur DEBUG avec un paramètre de ligne de commande comme celui-ci:

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

Comment puis-je savoir plus tard si l'enregistreur a été réglé sur DEBUG? J'écris un décorateur qui chronométrera une fonction si l'indicateur True lui est passé, et si aucun indicateur n'est donné, il affiche par défaut les informations de synchronisation lorsque l'enregistreur racine est défini sur DEBUG.

gct
la source
Vous voudrez éventuellement utiliser quelque chose de spécifique au lieu de le coupler à l'enregistreur, tel que opt ["time_functions"] (que vous pouvez utiliser par défaut sur True / False en fonction d'une autre option).

Réponses:

114
logging.getLogger().getEffectiveLevel()

logging.getLogger() sans arguments obtient le journal de niveau racine.

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

Tor Valamo
la source
Excellent, merci! Je faisais quelque chose comme ça (sauf en passant "root" explicite à getLogger), mais je le faisais dans la fonction init de mon décorateur, avant que le logger ne soit configuré pour déboguer: \
gct
5
Si vous voulez le nom du niveau, pas le nombre, vous pouvez l'utiliser pour convertir le nombre en une chaîne (comme 'INFO'): logging.getLevelName ()
guettli
2
@guettli, getLevelName () nécessite un argument contenant le niveau dont vous voulez obtenir la représentation textuelle. Donc , l'appel est en fait cette bête: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Ce serait bien d'avoir une syntaxe plus simple quand tout ce que vous voulez, c'est la chaîne du niveau actuel.
Trutane
Pour convertir l'entier de niveau en nom: docs.python.org/3/library/logging.html#levels
EddyTheB
103

En fait, il y a mieux: utilisez le codelogging.getLogger().isEnabledFor(logging.DEBUG) . Je l'ai trouvé en essayant de comprendre quoi faire avec le résultat de getEffectiveLevel().

Vous trouverez ci-dessous le code que le module de journalisation lui-même utilise.

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()
Tapoter
la source
4
Cela devrait être la réponse acceptée, car elle fait la même chose avec une complexité d'exécution moindre.
AndyJost
1
Si ce serait du code réel et non une image. Encore: voté.
kaiser le