• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Логгирование

См.также

Модуль журналирования Django расширяет встроенный модуль Python logging.

Ведение журнала настраивается как часть общей функции Django django.setup(), поэтому оно всегда доступно, если оно явно не отключено.

Конфигурация ведения журнала Django по умолчанию

По умолчанию Django использует формат Python logging.config.dictConfig.

Условия ведения журнала по умолчанию

Полный набор условий ведения журнала по умолчанию:

Когда DEBUG имеет значение True:

  • Регистратор django отправляет сообщения в иерархии django (кроме django.server) на уровне INFO или выше на консоль.

Когда DEBUG имеет значение False:

  • Регистратор django отправляет сообщения в иерархии django (кроме django.server) с уровнем ERROR или CRITICAL в AdminEmailHandler.

Независимо от значения DEBUG:

  • Регистратор джанго.сервер отправляет сообщения на уровне INFO или выше на консоль.

Все регистраторы, кроме джанго.сервер, передают журналирование своим родителям, вплоть до корневого регистратора 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.request

Сообщения журнала, связанные с обработкой запросов. Ответы 5XX выдаются как сообщения «ОШИБКА»; Ответы 4XX выдаются как сообщения «ПРЕДУПРЕЖДЕНИЕ». Запросы, которые регистрируются в регистраторе django.security, не регистрируются в django.request.

Сообщения этому регистратору имеют следующий дополнительный контекст:

  • status_code: код ответа HTTP, связанный с запросом.

  • request: объект запроса, который сгенерировал сообщение журнала.

джанго.сервер

Сообщения журнала, относящиеся к обработке запросов, полученных сервером, вызванным командой runserver. Ответы HTTP 5XX регистрируются как сообщения «ОШИБКА», ответы 4XX регистрируются как сообщения «ПРЕДУПРЕЖДЕНИЕ», а все остальное регистрируется как «ИНФО».

Сообщения этому регистратору имеют следующий дополнительный контекст:

  • status_code: код ответа HTTP, связанный с запросом.

  • request: объект запроса (socket.socket), который сгенерировал сообщение журнала.

django.template

Записывать сообщения, связанные с отрисовкой шаблонов.

  • Отсутствующие переменные контекста регистрируются как сообщения DEBUG.

django.db.backends

Сообщения, касающиеся взаимодействия кода с базой данных. Например, каждый оператор SQL уровня приложения, выполняемый по запросу, регистрируется на уровне DEBUG в этом регистраторе.

Сообщения этому регистратору имеют следующий дополнительный контекст:

  • длительность: время, необходимое для выполнения оператора SQL.

  • sql: оператор SQL, который был выполнен.

  • params: параметры, которые использовались в вызове SQL.

  • alias: псевдоним базы данных, используемый при вызове SQL.

Из соображений производительности ведение журнала SQL включено только тогда, когда для параметра settings.DEBUG установлено значение True, независимо от уровня ведения журнала или установленных обработчиков.

Это ведение журнала не включает инициализацию на уровне платформы (например, SET TIMEZONE). Включите ведение журнала запросов в своей базе данных, если вы хотите просматривать все запросы к базе данных.

django.utils.autoreload

Сообщения журнала, связанные с автоматической перезагрузкой кода во время выполнения сервера разработки Django. Этот регистратор генерирует сообщение INFO при обнаружении изменения в файле исходного кода и может выдавать сообщения ПРЕДУПРЕЖДЕНИЕ во время проверки файловой системы и процессов подписки на события.

django.contrib.auth

New in Django 4.2.16.

Сообщения журнала, относящиеся к django.contrib.auth, в частности сообщения ERROR, генерируются, когда PasswordResetForm успешно отправлен, но электронное письмо для сброса пароля не может быть доставлено из-за исключения при отправке почты.

django.contrib.gis

Сообщения журнала, относящиеся к GeoDjango, в различных точках: во время загрузки внешних библиотек GeoSpatial (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.db.backends.schema

Регистрирует SQL-запросы, которые выполняются во время изменения схемы базы данных с помощью миграционной среды. Обратите внимание, что он не регистрирует запросы, выполняемые RunPython. Сообщения этому регистратору содержат params и sql в их дополнительном контексте (но в отличие от django.db.backends, а не длительности). Значения имеют то же значение, что описано в django-db-logger.

django.contrib.sessions

Записывать сообщения, относящиеся к инфраструктуре сеансов.

  • Нефатальные ошибки, возникающие при использовании механизма django.contrib.sessions.backends.cached_db.SessionStore, регистрируются как сообщения ERROR с соответствующей обратной трассировкой.

Обработчики

Django предоставляет один обработчик журнала в дополнение к тех, которые предоставляются модулем ведения журналов Python.

class AdminEmailHandler(include_html=False, email_backend=None, reporter_class=None)

Этот обработчик отправляет электронное письмо на сайт ADMINS для каждого полученного сообщения журнала.

Если запись журнала содержит атрибут «запрос», в электронное письмо будет включена полная информация о запросе. Тема электронного письма будет включать фразу «внутренний 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.

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

а затем добавьте его в свою конфигурацию журналирования:

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

Этот фильтр будет передавать записи только в том случае, если для параметра 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

Этот фильтр аналогичен RequireDebugFalse, за исключением того, что записи передаются только тогда, когда DEBUG имеет значение True.

Back to Top