Ведение журнала
Модуль ведения журнала 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: Объект запроса (asocket.socket), который сгенерировал сообщение ведения журнала.
django.template
Журнализация сообщений, связанных с рендерингом шаблонов.
- Отсутствующие переменные контекста регистрируются как сообщения
DEBUG.
django.db.backends
Сообщения, связанные с взаимодействием кода с базой данных. Например, каждое SQL-выражение уровня приложения, выполненное запросом, регистрируется на уровне DEBUG в этом журнализаторе.
Сообщения в этом журнализаторе содержат следующий дополнительный контекст:
-
duration: Время выполнения SQL-выражения. -
sql: Выполненное SQL-выражение. -
params: Параметры, используемые в вызове SQL. -
alias: Псевдоним базы данных, используемый в вызове SQL.
Из соображений производительности ведение журнала SQL активируется только при settings.DEBUG установленном на True, независимо от уровня ведения журнала или установленных обработчиков.
Эта журнализация не включает инициализацию на уровне фреймворка (например, SET TIMEZONE). Включите журнализацию запросов в вашей базе данных, если хотите просмотреть все запросы к базе данных.
django.utils.autoreload
Журнализация сообщений, связанных с автоматической перезагрузкой кода во время выполнения сервера разработки Django. Этот журнализатор генерирует сообщение INFO при обнаружении изменения в файле исходного кода и может генерировать сообщения WARNING во время проверки файловой системы и процессов подписки на события.
django.contrib.gis
Журнализация сообщений, связанных с GeoDjango в различные моменты: во время загрузки внешних геопространственных библиотек (GEOS, GDAL и т. д.) и при сообщении об ошибках. Каждая запись журнала ERROR включает пойманное исключение и соответствующие контекстуальные данные.
django.dispatch
Этот журнализатор используется в Сигналах, конкретно внутри класса Signal, для сообщения об ошибках при отправке сигнала подключенному обработчику. Запись журнала ERROR включает пойманное исключение как exc_info и добавляет следующий дополнительный контекст:
-
receiver: Название обработчика. -
err: Исключение, возникшее при вызове обработчика.
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, вы можете переопределить конкретный журнализатор, следуя этому примеру:
LOGGING = {
# ...
"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.contrib.sessions
Журнализация сообщений, связанных с фреймворком сессий.
- Некритические ошибки, возникающие при использовании движка
django.contrib.sessions.backends.cached_db.SessionStore, регистрируются как сообщенияERRORс соответствующим трассировкой.
Обработчики
Django предоставляет один обработчик журнала в дополнение к those provided by the
Python logging module.
-
class AdminEmailHandler(include_html=False, email_backend=None, reporter_class=None)[source] -
Этот обработчик отправляет электронное письмо на сайт
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)[source] -
Отправляет электронные письма администраторам. Для настройки этого поведения можно создать подкласс класса
AdminEmailHandlerи переопределить этот метод.
-
Фильтры
Django предоставляет некоторые фильтры журналов в дополнение к тем, которые предоставляет модуль Python logging.
-
class CallbackFilter(callback)[source] -
Этот фильтр принимает функцию обратного вызова (которая должна принимать один аргумент, запись для ведения журнала), и вызывает её для каждой записи, проходящей через фильтр. Обработка этой записи не будет продолжена, если функция обратного вызова вернёт 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а затем добавить её в конфигурацию ведения журнала:
LOGGING = { # ... "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[source] -
Этот фильтр пропускает записи только когда settings.DEBUG имеет значение False.
Этот фильтр используется в стандартной конфигурации
LOGGING, чтобы убедиться, что обработчикAdminEmailHandlerотправляет электронные письма об ошибках администраторам только когдаDEBUGравноFalse.LOGGING = { # ... "filters": { "require_debug_false": { "()": "django.utils.log.RequireDebugFalse", }, }, "handlers": { "mail_admins": { "level": "ERROR", "filters": ["require_debug_false"], "class": "django.utils.log.AdminEmailHandler", }, }, # ... }
-
class RequireDebugTrue[source] -
Этот фильтр похож на
RequireDebugFalse, за исключением того, что записи пропускаются только когдаDEBUGравноTrue.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/ref/logging/