Как переопределить логирование в django.db.backends, чтобы оно работало при DEBUG=False?

В конфигурации django LOGGING для встроенного django.db.backends указано, что: "По соображениям производительности, протоколирование SQL включается только в том случае, если для settings.DEBUG установлено значение True, независимо от уровня протоколирования или установленных обработчиков."

В результате следующая конфигурация LOGGING, которая правильно настроена на выдачу журналов уровня отладки, показывающих запросы к БД, НЕ будет выдавать нужные мне сообщения:


DEBUG = False
LOGGING = {
    "version": 1,
    "disable_existing_loggers": True,
    "root": {"handlers": [ "gcp_structured_logging"]},
    "handlers": {
        "gcp_structured_logging": {
            "level": "DEBUG",
            "class": "django_gcp.logging.GoogleStructuredLogsHandler",
        }
    },
    "loggers": {
        'django.db.backends': {
            'handlers': ["gcp_structured_logging"],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

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

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

Как переопределить переопределение django, чтобы sql-запросы регистрировались так, как я задумал?

К счастью, мы можем переопределить это. Действительно, установив .force_debug_cursor соединения на True, например, в одном из AppConfig (любой конфигурации приложения) существует:

# my_app/apps.py

from django.apps import AppConfig
from django.db import connection


class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        connection.force_debug_cursor = True

Это работает, потому что Django сам решает, вести ли журнал с [GitHub]:

@property
def queries_logged(self):
    return self.force_debug_cursor or settings.DEBUG
Вернуться на верх