Как переопределить логирование в 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