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


93

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

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

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


В конечном итоге вы захотите использовать что-то конкретное, вместо того, чтобы связывать это с регистратором, например 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, исправлено. СПАСИБО!
Килунг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.