Для регистратора не найдено никаких обработчиков
Я новичок в Django. Сейчас я пытаюсь выполнить запись в Django. При попытке, я получаю эту ошибку [ "Нет обработчиков для журнала" sample ""].. вот мой код,
(В моих settings.py)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
},
},
'handlers': {
'default': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': '/home/linuxuser/mani/f/logs/msg.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'simple',
},
},
'loggers': {
'sample': {
'handlers': ['default'],
'level': 'DEBUG',
'propagate': True,
},
}
}
(В моих views.py)
import logging
import logging.handlers
from django.conf import settings
logger = logging.getLogger('sample')
def empdel(request,id):
e = get_object_or_404(emp, pk=id)
e.delete()
logger.info('A row is deleted successfully !!!')
return HttpResponseRedirect('/empthanks/')
При запуске этого кода я получил эту ошибку, т.е. [ "Нет обработчиков для журнала" sample ""]. Что не так с моим кодом? Почему я получаю такую ошибку, даже если я использую обработчик в LOGGING? а также я пытаюсь сохранить сообщение журнала в файл, который я использовал в LOGGING... любая идея?? Спасибо заранее.
Ответы
Ответ 1
Документы немного неясны в этом, но когда вы используете встроенную функциональность для указания параметров ведения журнала, вам не нужно получать экземпляр регистратора.
Вы просто выполните следующее:
import logging
def empdel(request,id):
e = get_object_or_404(emp, pk=id)
e.delete()
logging.info('A row is deleted successfully !!!')
return HttpResponseRedirect('/empthanks/')
Ответ 2
Я думаю, вы неправильно поняли, что такое Handler
в контексте пакета logging
.
Обработчик - это объект, который вы прикрепляете к Logger.
Всякий раз, когда журнал имеет сообщение для обработки, он отправляет сообщение всем своим обработчикам.
Кроме того, регистраторы существуют в древовидной структуре, с меткой "root" Logger в ее корне.
После отправки сообщения своим обработчикам, регистратор может передать его родительскому элементу в дереве (определяется атрибутом экземпляра Logger propagate
).
Как немного юмористический, я однажды обнаружил ошибку приложения, в которой кто-то начал использовать Logger с именем "root", который отличается от Root Logger.
Не используйте корневой регистратор (доступ к которому осуществляется logging.info
и компанией, или logging.getLogger()
).
Любые обработчики, которые вы прикрепляете или изменяете настройки, также будут влиять на хорошо выполненные библиотеки, которые распространяют свои ошибки до корневого регистратора.
Пример: я как-то написал простой script, используя корневой регистратор из лени.
Затем я включил несколько вызовов на boto
и получил взрыв сообщений отладки, которые распространялись в корневой журнал.
Рекомендуется всегда создавать регистратор, имя которого соответствует имени вашего пакета в пространстве имен (это также приводит к хорошей структуре наследования с интерпретацией getLogger
.
), создавая регистраторы с logging.getLogger(__name__)
Я настоятельно рекомендую подробно ознакомиться с разделом об объектах Logger в документах logging
: https://docs.python.org/2/library/logging.html
Вы можете заметить, что ваш конфиг также указывает Formatter
.
Formatters обрабатывают представление сообщения, когда оно обрабатывается обработчиком, так что одно сообщение может быть отформатировано по-разному для вывода терминала, чем для, например, 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/