добавлен. В противном случае он возвращает root logger. Так что в этом случае программа использует общий логгер в качестве функции

дал следующий скрипт. Может ли кто-нибудь из вас объяснить мне, почему результат такой, как показано ниже?

Источник
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

print('debug', logger.isEnabledFor(logging.DEBUG))
print('info', logger.isEnabledFor(logging.INFO))
print('warning', logger.isEnabledFor(logging.WARNING))
print('error', logger.isEnabledFor(logging.ERROR))

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
Выход
debug True
info True
warning True
error True
warning
error
DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error

конкретно

в чем разница междуlogger.info а такжеlogging.info Вот

как же такlogger.isEnabledFor(logging.DEBUG) являетсяTrue покаlogger.debug('debug') ничего не показывает

как же такlogger.info не имеет выхода, ноlogging.info имеет

Ответы на вопрос(2)

Решение Вопроса

Уровень журнала по умолчанию для корневого регистратораWARNING

Root logger не инициализируется, если вы ничего не делаете, то есть без установки каких-либо обработчиков или форматера:

>>> import logging
>>> logging.root.handlers
[]

Хорошо, но вы обнаружили проблему: когда уровень ведения журнала установлен наDEBUG, root logger не работает должным образом. Отладочные сообщения игнорируются. С тем же не настроенным корневым логгером предупреждения выводятся нормально. Почему это?

Имейте в виду, что сейчас у нас нет обработчика для root logger. Но, глядя вкодмы видим:

    if (found == 0):
        if lastResort:
            if record.levelno >= lastResort.level:
                lastResort.handle(record)
        elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
            sys.stderr.write("No handlers could be found for logger"
                             " \"%s\"\n" % self.name)
            self.manager.emittedNoHandlerWarning = True

Что означает, у нас естьlastResort для резервного копирования, если обработчик не найден. Вы можете обратиться к определениюlastResort, инициализируется уровнем логированияWARNING, Между тем, отладочные сообщения не имеют этой резервной копии, поэтому они игнорируются, когда не установлен обработчик.

По вашим вопросам:

Эти два регистратора идентичны, так как корневой регистратор возвращается, когдаgetLogger() не получает аргументов.Смотри ниже:

Logger.isEnabledFor (LVL)

Указывает, будет ли обрабатываться сообщение серьезности lvl этим регистратором. Этот метод сначала проверяет уровень уровня модуля, установленный logging.disable (lvl), а затем эффективный уровень регистратора, определенный getEffectiveLevel ().

Вызов любых функций регистрации вlogging модуль инициализирует корневой логгер с помощьюbasicConfig() который добавляет обработчик по умолчанию, так что последующие вызовыlogger тоже будет работать.

Что вы должны сделать, это использоватьlogging.basicConfig() установить обработчик по умолчанию для корневого регистратора, и сообщения будут выводиться в соответствии с уровнем регистратора и уровнем сообщений.

 Liu Sha12 окт. 2017 г., 05:03
Спасибо @Ares Ou. Я понял вашу точку зрения на поведениеlogger, Не могли бы вы также объяснить, почемуlogging.debug работает еслиlogging.debug а такжеlogger.debug это одно и то же.
 Cheney12 окт. 2017 г., 05:11
Они всеroot logger, но когда вы звонитеlogging.debug, basicConfig() называется, которые имеют значение. если ты позвонишьlogger.debug('debug') после кода выше, вы увидите выводDEBUG:root:debug тогда вы поймете.
 Liu Sha12 окт. 2017 г., 05:20
Вы имеете в виду, что любой вызовlogging.log инициализирует корневой логгерbasicConfig() если он еще не инициализирован?
 Cheney13 окт. 2017 г., 06:37
Нет! ты можешь читать. Регистрация [войти | отлаживать | ...]. basicConfig() вызывается только когдаroot не имеетhandler
 P1h3r1e3d1306 мар. 2018 г., 17:53
Если я правильно понимаю, экземпляр журнала обрабатывает INFO и DEBUG, но обработчик (по умолчанию) не? Может быть, вы могли бы уточнить разницу между уровнем логгера и уровнем обработчика.

getLogger создает экземпляр класса Logger, если аргументname добавлен. В противном случае он возвращает root logger. Так что в этом случае программа использует общий логгер в качестве функцииlogging.debug, logging.info, logging.warning, logging.info

Ваш ответ на вопрос