Как определить, установлен ли корневой регистратор на уровень DEBUG в Python?

93

Если я установлю для модуля ведения журнала значение DEBUG с таким параметром командной строки:

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

Как я могу позже определить, установлен ли регистратор на DEBUG? Я пишу декоратор, который будет синхронизировать функцию, если ему передан флаг True, и если флаг не задан, он по умолчанию выводит информацию о времени, когда корневой регистратор установлен на DEBUG.

gct
источник
В конечном итоге вы захотите использовать что-то конкретное, вместо того, чтобы связывать это с регистратором, например opt ["time_functions"] (для которого вы можете по умолчанию использовать True / False в зависимости от другой опции).

Ответы:

116
logging.getLogger().getEffectiveLevel()

logging.getLogger() без аргументов получает логгер корневого уровня.

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

Тор Валамо
источник
Отлично, спасибо! Я делал что-то подобное (за исключением того, что явно передавал "root" в getLogger), но я делал это в функции init моего декоратора до того, как регистратор был настроен на отладку: \
gct
5
Если вам нужно имя уровня, а не число, вы можете использовать это для преобразования числа в строку (например, «INFO»): logging.getLevelName ()
guettli
2
@guettli, getLevelName () требует одного аргумента, содержащего уровень, текстовое представление которого вы хотите получить. Поэтому вызов на самом деле это животное: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Было бы неплохо иметь более простой синтаксис, когда все, что вам нужно, - это строка для текущего уровня.
Trutane
Чтобы преобразовать целое число уровня в имя: docs.python.org/3/library/logging.html#levels
EddyTheB
106

На самом деле, лучше использовать кодlogging.getLogger().isEnabledFor(logging.DEBUG) . Нашел, пытаясь понять, что делать с результатом getEffectiveLevel().

Ниже приведен код, который использует сам модуль ведения журнала.

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
Это должен быть принятый ответ, поскольку он делает то же самое с меньшей сложностью времени выполнения.
AndyJost
1
Если бы это был реальный код, а не изображение. Тем не менее: проголосовали за.
kaiser
3

Только

logging.getLogger().level == logging.DEBUG
Килунг
источник
Это не дает ответа на вопрос. Как только у вас будет достаточная репутация, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют пояснений от спрашивающего . - Из
отзыва
@VineethSai, исправлено. СПАСИБО!
Килунг