Визначення, чи встановлено кореневий реєстратор на рівні 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


Чудово, дякую! Я робив щось подібне (за винятком передачі явного "кореня" до getLogger), але я робив це у функції init мого декоратора, перш ніж реєстратор був встановлений для налагодження: \
gct

5
Якщо вам потрібне ім'я рівня, а не номер, ви можете використати це для перетворення числа у рядок (наприклад, "ІНФО"): logging.getLevelName ()
guettli

2
@guettli, getLevelName () вимагає одного аргументу, що містить рівень, текстове представлення якого ви хочете отримати. Тому виклик насправді це тварина: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Було б непогано мати простіший синтаксис, коли все, що вам потрібно - це рядок для поточного рівня.
Трутан

Щоб перетворити ціле число рівня в ім'я: 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

Це не дає відповіді на запитання. Отримавши достатню репутацію, ви зможете коментувати будь-яку публікацію ; натомість надайте відповіді, які не вимагають роз’яснень від запитувача . - З огляду
Vineeth Sai

@VineethSai, Виправлено. ДЯКУЮ!
Кілунг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.