Журнал SQL-запросов, даже если DEBUG = False - PullRequest
1 голос
/ 15 октября 2019

Это моя конфигурация регистрации в settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'logs', 'django.log'),
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'django.template': {
            'handlers': ['file', 'console'],
            'level': 'INFO',
        },
        'App': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    },
}

Есть поведение, которое я не могу объяснить: если я запускаю с debug=True, я вижу все запросы SQL, записываемые на консоль,но когда debug=False этого не происходит, даже если я не изменяю конфигурацию выше.

Почему это так? Как я могу определить в своей конфигурации ведения журнала, регистрируются ли запросы SQL на консоли?

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Это потому, что существующие логгеры уже отфильтровали ваши логи. В этом случае регистратор Django .

DEFAULT_LOGGING = {
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
    ...
}

и django.utils.log.RequireDebugTrue

class RequireDebugTrue(logging.Filter):
    def filter(self, record):
        return settings.DEBUG

Чтобы решить эту проблему, вы можете отключить существующие регистраторы, установив disable_existing_loggers: Trueили вы можете переопределить фильтр следующим образом:

LOGGING = {
    ...
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'filters': [],
        },
    ...
}
0 голосов
/ 15 октября 2019

Регистрация запросов идет намного глубже, так как Django переносит курсор базы данных на основе достоверности вычисляемого свойства.

Из Строка 226, django.db.backends.base.base v2.2.6 sources

def _prepare_cursor(self, cursor):
    """
    Validate the connection is usable and perform database cursor wrapping.
    """
    self.validate_thread_sharing()
    if self.queries_logged:
        wrapped_cursor = self.make_debug_cursor(cursor)
    else:
        wrapped_cursor = self.make_cursor(cursor)
    return wrapped_cursor

Это вычисленное свойство должно быть определено, где принудительная отладка включена или включена отладка в настройках проекта

С Строка 149, django.db.backends.base.base v2.2.6 sources

@property
def queries_logged(self):
    return self.force_debug_cursor or settings.DEBUG

Вы должны иметь возможность получить прокси для соединения по умолчанию и принудительно использовать курсор отладки.

from django.db import connection

connection.force_debug_cursor = True

I однакосоветую против такого подхода и одобряю аудит запросов в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...