Ведение журнала
Модуль ведения журнала Django расширяет встроенный модуль Python logging.
Ведение журнала настраивается в рамках общей функции Django django.setup(), поэтому оно всегда доступно, если явно не отключено.
Стандартная конфигурация ведения журнала Django
По умолчанию Django использует формат logging.config.dictConfig Python.
Стандартные условия ведения журнала
Полный набор стандартных условий ведения журнала:
Когда DEBUG равно True:
- Логгер
djangoотправляет сообщения в иерархииdjango(кромеdjango.server) на уровнеINFOили выше в консоль.
Когда DEBUG равно False:
- Логгер
djangoотправляет сообщения в иерархииdjango(кромеdjango.server) с уровнемERRORилиCRITICALвAdminEmailHandler.
Независимо от значения DEBUG:
- Логгер django.server отправляет сообщения на уровне
INFOили выше в консоль.
Все логгеры, кроме django.server, передают логирование своим родителям, до корневого логгера django. Обработчики console и mail_admins прикреплены к корневому логгеру для обеспечения описанного выше поведения.
Встроенные настройки Python отправляют записи уровня WARNING и выше в консоль.
Определение стандартного ведения журнала
Стандартная конфигурация ведения журнала Django наследует значения по умолчанию Python. Она доступна как django.utils.log.DEFAULT_LOGGING и определена в django/utils/log.py:
{
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[{server_time}] {message}',
'style': '{',
}
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
}
}
См. Настройка ведения журнала о том, как дополнить или заменить эту стандартную конфигурацию ведения журнала.
Расширения ведения журнала Django
Django предоставляет ряд утилит для обработки особых требований к ведению журнала в среде веб-сервера.
Логгеры
Django предоставляет несколько встроенных логгеров.
django
Родительский логгер для сообщений в иерархии django иерархии именованных логгеров. Django не публикует сообщения с этим именем. Вместо этого он использует один из логгеров ниже.
django.request
Сообщения журнала, связанные с обработкой запросов. Ответы 5XX поднимаются как сообщения ERROR; ответы 4XX поднимаются как сообщения WARNING. Запросы, которые записываются в логгер django.security, не записываются в django.request.
Сообщения в этом логгере содержат дополнительный контекст:
-
status_code: Код HTTP-ответа, связанный с запросом. -
request: Объект запроса, который сгенерировал сообщение в журнале.
django.server
Сообщения журнала, связанные с обработкой запросов, полученных сервером, вызванным командой runserver. Ответы HTTP 5XX записываются как сообщения ERROR; ответы 4XX записываются как сообщения WARNING; всё остальное записывается как INFO.
Сообщения в этом логгере содержат дополнительный контекст:
-
status_code: Код HTTP-ответа, связанный с запросом. -
request: Объект запроса, который сгенерировал сообщение в журнале.
django.template
Сообщения журнала, связанные с рендерингом шаблонов.
- Отсутствующие переменные контекста записываются как сообщения
DEBUG.
django.db.backends
Сообщения, относящиеся к взаимодействию кода с базой данных. Например, каждое SQL-утверждение уровня приложения, выполненное запросом, записывается на уровне DEBUG в этот логгер.
Сообщения в этом логгере содержат дополнительный контекст:
-
duration: Время выполнения SQL-запроса. -
sql: SQL-запрос, который был выполнен. -
params: Параметры, которые были использованы в вызове SQL. -
alias: Псевдоним базы данных, используемый в вызове SQL.
По соображениям производительности, SQL-логирование включено только тогда, когда settings.DEBUG установлено в True, независимо от уровня логирования или установленных обработчиков.
Это логирование не включает инициализацию на уровне фреймворка (например, SET TIMEZONE) или запросы управления транзакциями (например, BEGIN, COMMIT и ROLLBACK). Включите логирование запросов в вашей базе данных, если вы хотите просмотреть все запросы к базе данных.
Была добавлена база данных alias для записи сообщений в журнал.
django.security.*
Логгеры безопасности получат сообщения при любом возникновении SuspiciousOperation и других ошибках, связанных с безопасностью. Существует подлоггер для каждого подтипа ошибки безопасности, включая все SuspiciousOperation. Уровень события в журнале зависит от того, где обрабатывается исключение. Большинство случаев регистрируются как предупреждение, в то время как любое SuspiciousOperation, которое достигает обработчика WSGI, будет зарегистрировано как ошибка. Например, когда HTTP-заголовок Host включается в запросе от клиента, который не соответствует ALLOWED_HOSTS, Django вернёт ответ 400, и сообщение об ошибке будет записано в логгер django.security.DisallowedHost.
Эти события журнала по умолчанию попадают в логгер django который отправляет события об ошибках администраторам, когда DEBUG=False. Запросы, которые приводят к ответу 400 из-за SuspiciousOperation не будут записаны в логгер django.request, а только в логгер django.security.
Чтобы отключить определённый тип SuspiciousOperation, можно переопределить соответствующий логгер, как в данном примере:
'handlers': {
'null': {
'class': 'logging.NullHandler',
},
},
'loggers': {
'django.security.DisallowedHost': {
'handlers': ['null'],
'propagate': False,
},
},
Другие логгеры django.security, не основанные на SuspiciousOperation:
-
django.security.csrf: Для отклоненных запросов CSRF.
django.db.backends.schema
Записывает SQL-запросы, выполняемые во время изменений схемы базы данных фреймворком миграций. Обратите внимание, что он не будет записывать запросы, выполненные RunPython. Сообщения в этом логгере содержат params и sql в контексте (но, в отличие от django.db.backends, без времени выполнения). Значения имеют то же значение, что и описано в django.db.backends.
Обработчики
Django предоставляет один обработчик журнала помимо those provided by the
Python logging module.
-
class AdminEmailHandler(include_html=False, email_backend=None, reporter_class=None) -
Этот обработчик отправляет электронное письмо администраторам сайта
ADMINSдля каждого сообщения журнала, которое он получает.Если запись журнала содержит атрибут
request, полные детали запроса будут включены в электронное письмо. В теме письма будет указана фраза «внутренний IP», если IP-адрес клиента находится в настройкеINTERNAL_IPS; в противном случае будет указана фраза «внешний IP».Если запись журнала содержит отладочную информацию, эта информация будет включена в электронное письмо.
Аргумент
include_htmlобработчикаAdminEmailHandlerиспользуется для управления тем, будет ли электронное письмо со стеком вызовов содержать HTML-приложение, содержащее полное содержимое веб-страницы отладки, которая была бы создана, если быDEBUGбылоTrue. Чтобы установить это значение в своей конфигурации, включите его в определение обработчика дляdjango.utils.log.AdminEmailHandler, как показано ниже:'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True, }, },Следите за последствиями использования журналирования для безопасности, когда используете
AdminEmailHandler.Установив аргумент
email_backendобработчикаAdminEmailHandler, можно переопределить используемый почтовый бэкенд, как показано ниже:'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'email_backend': 'django.core.mail.backends.filebased.EmailBackend', }, },По умолчанию будет использоваться экземпляр почтового бэкенда, указанного в
EMAIL_BACKEND.Аргумент
reporter_classобработчикаAdminEmailHandlerпозволяет указать подклассdjango.views.debug.ExceptionReporter, чтобы настроить текст стека вызовов, отправляемый в теле электронного письма. Укажите строковый путь импорта класса, который вы хотите использовать, как показано ниже:'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True, 'reporter_class': 'somepackage.error_reporter.CustomErrorReporter', }, },-
send_mail(subject, message, *args, **kwargs) -
Отправляет электронные письма администраторам. Чтобы настроить это поведение, можно создать подкласс класса
AdminEmailHandlerи переопределить этот метод.
-
Фильтры
Django предоставляет некоторые фильтры для журналов помимо тех, которые предоставляет модуль Python logging.
-
class CallbackFilter(callback) -
Этот фильтр принимает функцию обратного вызова (которая должна принимать один аргумент, запись, подлежащую регистрации), и вызывает её для каждой записи, которая проходит через фильтр. Обработка этой записи не будет продолжена, если функция обратного вызова вернёт значение False.
Например, чтобы отфильтровать
UnreadablePostError(возникает, когда пользователь отменяет загрузку) из электронных писем администратора, вы создадите функцию фильтра:from django.http import UnreadablePostError def skip_unreadable_post(record): if record.exc_info: exc_type, exc_value = record.exc_info[:2] if isinstance(exc_value, UnreadablePostError): return False return Trueа затем добавите её в конфигурацию регистрации:
'filters': { 'skip_unreadable_posts': { '()': 'django.utils.log.CallbackFilter', 'callback': skip_unreadable_post, }, }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['skip_unreadable_posts'], 'class': 'django.utils.log.AdminEmailHandler', }, },
-
class RequireDebugFalse -
Этот фильтр пропускает записи только при значении settings.DEBUG равном False.
Этот фильтр используется в стандартной конфигурации
LOGGINGдля того, чтобыAdminEmailHandlerотправлял сообщения об ошибках администраторам только тогда, когдаDEBUGравноFalse.'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', }, },
-
class RequireDebugTrue -
Этот фильтр похож на
RequireDebugFalse, за исключением того, что записи пропускаются только при значенииDEBUG, равномTrue.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.1/ref/logging/