Я думаю, вы неправильно поняли, что такое Handler
в контексте пакета logging
.
Обработчик - это объект, который вы присоединяете к Logger.Всякий раз, когда у регистратора есть сообщение для обработки, он отправляет сообщение всем своим обработчикам.Кроме того, логгеры существуют в древовидной структуре с метко названным «корневым» логгером в его корне.После отправки сообщения своим обработчикам, регистратор может передать его своему родительскому элементу в дереве (определяется атрибутом propagate
экземпляра регистратора).
Как немного с юмором, я однажды обнаружил ошибку приложенияв котором кто-то начал использовать Logger с именем «root», который отличается от Root Logger.
Не используйте root logger (к которому обращаются logging.info
и компания, или logging.getLogger()
).Любые обработчики, которые вы присоединяете, или настройки, которые вы изменяете, также влияют на библиотеки с хорошим поведением, которые распространяют свои ошибки вплоть до корневого регистратора.Показательный пример: однажды я написал простой скрипт, используя root-логи из-за лени.Затем я добавил несколько звонков на boto
и получил отладочные сообщения, которые передавались в корневой логгер.Рекомендуется всегда создавать регистратор, имя которого совпадает с именем вашего пакета в пространстве имен (это также приводит к хорошей структуре наследования с интерпретацией getLogger
.
), создавая регистраторы с logging.getLogger(__name__)
Я настоятельно рекомендую внимательно прочитать раздел об объектах регистратора в logging
документах: https://docs.python.org/2/library/logging.html
Вы можете заметить, что в вашей конфигурации также указан Formatter
.Форматировщики обрабатывают представление сообщения, когда оно обрабатывается обработчиком, так что одно сообщение может быть отформатировано для вывода на терминал иначе, чем, например, для rsyslog.
Все это сказано, чтобыИсправив ваш код, вы можете использовать созданный вами регистратор и просто прикрепить к нему обработчик.Я бы порекомендовал создать StreamHandler
(базовый класс Handler
не предназначен для создания экземпляра, но по ужасным причинам не является ABC), поскольку он охватывает множество типичных случаев использования.
myhandler = logging.StreamHandler() # writes to stderr
myformatter = logging.Formatter(fmt='%(levelname)s: %(message)s')
myhandler.setFormatter(myformatter)
logger.addHandler(myhandler)
Однако, похоже, что в конфигурации Django уже есть много этой информации, конечно, она не настроена так, как я это делаю выше.Не написав на самом деле приложения для Django, я не хочу давать вам недостоверную информацию об этом, но Django предоставляет здесь хорошие документы: https://docs.djangoproject.com/en/dev/topics/logging/