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.


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


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()

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.