Spec-Zone.ru › Django 5.2

Как настроить и использовать журналирование

См. также

  • Справочник по журналированию Django
  • Обзор журналирования Django

Django предоставляет рабочую стандартную конфигурацию журналирования, которую легко расширить.

Вызов базовой функции журналирования

Чтобы отправить сообщение журнала из кода, разместите вызов журналирования в нём.

Не стоит пытаться использовать вызовы журналирования в settings.py.

Способ настройки журналирования Django как части функции setup() означает, что вызовы журналирования, размещённые в settings.py, могут работать не так, как ожидается, потому что журналирование не будет настроено на этом этапе. Для изучения журналирования используйте функцию представления, как показано в примере ниже.

Сначала импортируйте библиотеку Python для журналирования, а затем получите экземпляр регистратора с помощью logging.getLogger(). Предоставьте методу getLogger() имя для идентификации и записей, которые он генерирует. Хорошим вариантом является использование __name__ (см. Использование именования регистраторов ниже для получения дополнительной информации об этом), которое предоставит имя текущего модуля Python в виде пути с точками:

import logging

logger = logging.getLogger(__name__)

Рекомендуется выполнить это объявление на уровне модуля.

И затем в функции, например, в представлении, отправьте запись в регистратор:

def some_view(request):
    ...
    if some_risky_state:
        logger.warning("Platform is running at risk")

При выполнении этого кода LogRecord с этим сообщением будет отправлен в регистратор. Если вы используете стандартную конфигурацию журналирования Django, сообщение появится в консоли.

Уровень WARNING, используемый в примере выше, является одним из нескольких уровней серьёзности журналирования: DEBUG, INFO, WARNING, ERROR, CRITICAL. Так, другой пример может быть:

logger.critical("Payment system is not responding")

Важно

Записи с уровнем ниже WARNING по умолчанию не появятся в консоли. Изменение этого поведения требует дополнительной конфигурации.

Настройка конфигурации ведения журналов

Хотя конфигурация ведения журнала Django работает «из коробки», вы можете контролировать то, как ваши журналы отправляются в различные места — в файлы журналов, внешние сервисы, по электронной почте и так далее — с помощью дополнительной настройки.

Вы можете настроить:

  • отображение логгеров, чтобы определить, какие записи отправляются в какие обработчики;
  • обработчики, чтобы определить, что они делают с полученными записями;
  • фильтры, чтобы обеспечить дополнительный контроль над передачей записей и даже изменить записи на месте;
  • форматеры, чтобы преобразовать объекты LogRecord в строку или другую форму для потребления человеком или другой системой.

Существует множество способов настройки ведения журнала. В Django чаще всего используется настройка LOGGING. Эта настройка использует формат dictConfig и расширяет стандартную конфигурацию ведения журнала.

См. Настройка ведения журнала для объяснения того, как пользовательские настройки объединяются с настройками по умолчанию Django.

См. Python logging documentation для получения подробной информации о других способах настройки ведения журнала. Для простоты в данном руководстве будет рассмотрена только настройка через настройку LOGGING.

Базовая конфигурация логгера

При настройке ведения журнала имеет смысл

Создать словарь LOGGING

В вашем settings.py:

LOGGING = {
    "version": 1,  # the dictConfig format version
    "disable_existing_loggers": False,  # retain the default loggers
}

Практически всегда имеет смысл сохранить и расширить стандартную конфигурацию ведения журнала, установив disable_existing_loggers в значение False.

Настройка обработчика

В этом примере настраивается единственный обработчик с именем file, который использует FileHandler Python для сохранения логов уровня DEBUG и выше в файл general.log (в корне проекта):

LOGGING = {
    # ...
    "handlers": {
        "file": {
            "class": "logging.FileHandler",
            "filename": "general.log",
        },
    },
}

Разные классы обработчиков принимают разные параметры конфигурации. Более подробную информацию о доступных классах обработчиков см. в AdminEmailHandler, предоставляемом Django, и различных handler classes, предоставляемых Python.

Уровни логов также можно устанавливать в обработчиках (по умолчанию они принимают сообщения всех уровней). Используя пример выше, добавление:

{
    "class": "logging.FileHandler",
    "filename": "general.log",
    "level": "DEBUG",
}

определит конфигурацию обработчика, которая принимает только записи уровня DEBUG и выше.

Настройка отображения логгера

Для отправки записей в этот обработчик настройте отображение логгера, чтобы использовать его, например:

LOGGING = {
    # ...
    "loggers": {
        "": {
            "level": "DEBUG",
            "handlers": ["file"],
        },
    },
}

Имя отображения определяет, какие записи лога оно будет обрабатывать. Эта конфигурация ('') неименованная. Это означает, что она будет обрабатывать записи всех логгеров (см. Использование пространства имён логгеров ниже, чтобы узнать, как использовать имя отображения для определения логгеров, для которых она будет обрабатывать записи).

Она будет пересылать сообщения уровней DEBUG и выше обработчику с именем file.

Обратите внимание, что один логгер может пересылать сообщения нескольким обработчикам, поэтому отношение между логгерами и обработчиками — многие ко многим.

Если вы выполните:

logger.debug("Attempting to connect to API")

в своём коде, вы найдёте это сообщение в файле general.log в корне проекта.

Настройка форматера

По умолчанию конечный вывод журнала содержит часть сообщения каждого объекта log record. Используйте форматер, если хотите включить дополнительные данные. Сначала назовите и определите форматеры — этот пример определяет форматеры с именами verbose и simple:

LOGGING = {
    # ...
    "formatters": {
        "verbose": {
            "format": "{name} {levelname} {asctime} {module} {process:d} {thread:d} {message}",
            "style": "{",
        },
        "simple": {
            "format": "{levelname} {message}",
            "style": "{",
        },
    },
}

Ключевое слово style позволяет указать { для форматирования str.format() или $ для форматирования string.Template; по умолчанию используется $.

См. Атрибуты LogRecord для атрибутов LogRecord, которые вы можете включить.

Чтобы применить форматер к обработчику, добавьте запись formatter в словарь обработчика, ссылаясь на форматер по имени, например:

"handlers": {
    "file": {
        "class": "logging.FileHandler",
        "filename": "general.log",
        "formatter": "verbose",
    },
}

Использование пространства имён логгеров

Неименованная конфигурация ведения журнала '' собирает журналы из любого приложения Python. Наименованная конфигурация ведения журнала будет собирать журналы только из логгеров с соответствующими именами.

Пространство имён экземпляра логгера определяется с помощью getLogger(). Например, в views.py из my_app:

logger = logging.getLogger(__name__)

создаст логгер в пространстве имён my_app.views. __name__ позволяет организовывать сообщения журналов в соответствии с их происхождением в приложениях вашего проекта автоматически. Это также гарантирует, что у вас не будет столкновений имён.

Отображение логгера с именем my_app.views соберет записи из этого логгера:

LOGGING = {
    # ...
    "loggers": {
        "my_app.views": {...},
    },
}

Отображение логгера с именем my_app будет более гибким, собирая записи из логгеров в любом месте пространства имён my_app (включая my_app.views, my_app.utils и так далее):

LOGGING = {
    # ...
    "loggers": {
        "my_app": {...},
    },
}

Вы также можете явно определить пространство имён логгеров:

logger = logging.getLogger("project.payment")

и настроить отображения логгеров соответственно.

Использование иерархии и распространения логгеров

Имена логгеров иерархические. my_app является родительским элементом my_app.views, который является родительским элементом my_app.views.private. Если не указано иное, отображения логгеров будут распространять обрабатываемые записи своим родителям — запись из логгера в пространстве имён my_app.views.private будет обрабатываться отображениями как для my_app, так и для my_app.views.

Чтобы управлять этим поведением, установите ключ распространения в отображениях, которые вы определяете:

LOGGING = {
    # ...
    "loggers": {
        "my_app": {
            # ...
        },
        "my_app.views": {
            # ...
        },
        "my_app.views.private": {
            # ...
            "propagate": False,
        },
    },
}

propagate по умолчанию установлено в значение True. В этом примере логи из my_app.views.private не будут обрабатываться родителем, но логи из my_app.views будут.

Настройка адаптивного ведения журнала

Журналирование наиболее полезно, когда оно содержит как можно больше информации, но не информацию, которая вам не нужна — а сколько вам нужно, зависит от того, что вы делаете. При отладке вам нужен уровень информации, который был бы избыточным и бесполезным, если бы вам пришлось иметь с ним дело в рабочей среде.

Вы можете настроить ведение журнала, чтобы получить нужный уровень подробностей, когда это нужно. Вместо того чтобы вручную изменять конфигурацию для достижения этого, лучше использовать автоматическую настройку в зависимости от среды.

Например, вы можете установить переменную среды DJANGO_LOG_LEVEL соответствующим образом в средах разработки и предварительной оценки и использовать её в отображении логгера, таким образом:

"level": os.getenv("DJANGO_LOG_LEVEL", "WARNING")

- чтобы, если среда не указывает более низкий уровень журнала, эта настройка будет пересылать только записи с уровнем серьезности WARNING и выше в свой обработчик.

Другие параметры в конфигурации (например, параметр level или formatter обработчиков) могут быть аналогичным образом управляемы.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/howto/logging/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API