Я пытаюсь настроить регистратор по умолчанию для библиотеки API, которую я пишу.В документации по Python говорится, чтобы установить NullHandler в библиотеке, а затем позволить разработчикам, использующим библиотеку, определить, как следует вести запись в журнал.
Примечание. Настоятельно рекомендуется не добавлять никаких обработчиков, кромечем NullHandler для регистраторов вашей библиотеки.Это потому, что конфигурация обработчиков является прерогативой разработчика приложения, который использует вашу библиотеку.Разработчик приложения знает свою целевую аудиторию и какие обработчики наиболее подходят для их приложения: если вы добавите обработчики «под капотом», вы вполне можете помешать их способности проводить модульные тесты и предоставлять журналы, которые соответствуют их требованиям.
https://docs.python.org/3/howto/logging.html#logging-advanced-tutorial
import logging
logging.getLogger('foo').addHandler(logging.NullHandler())
Итак, для такого модуля, как myapi.py, я мог бы иметь:
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler)
class MyApi: ...
А затем в файле модульного теста,Я бы установил фактический обработчик журнала.
import logging
log = logging.getLogger('myapi')
log.handlers = []
log.addHandler(logging.StreamHandler(sys.stdout))
log.setLevel(logging.DEBUG)
class MyApiTests(unittest.TestCase): ...
Проблема, с которой я столкнулся, заключается в том, что NullHandler вызывает сообщение об ошибке при запуске модульных тестов.
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1590, in callHandlers
if record.levelno >= hdlr.level:
AttributeError: type object 'NullHandler' has no attribute 'level'
IЯ пробовал несколько вещей, чтобы удалить ошибку.Сначала я попытался удалить существующий обработчик;log.handlers = [].Похоже, это ничего не изменило.Я также пытался установить уровень журнала;log.setLevel (logging.DEBUG).Я все еще получаю сообщение об ошибке.
Я что-то упускаю.Может кто-нибудь объяснить, как удалить NullHandler или предотвратить сообщение об ошибке?