регистрировать все запросы sql

98

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

Я хочу регистрировать все, включая SQL-запросы с сайта администратора. Я видел этот вопрос и ответы на часто задаваемые вопросы, но до сих пор не могу понять, куда мне положить

from django.db import connection
connection.queries

записывать все в один файл?

Итак, мой вопрос: что мне делать, чтобы иметь файл (скажем, all-sql.log), в котором регистрируются все операторы SQL?

Олег Павлов
источник
stackoverflow.com/questions/1074212/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

19

Возможно, проверьте https://github.com/django-debug-toolbar/django-debug-toolbar

Это позволит вам увидеть все запросы, сгенерированные данной страницей. А также трассировки стека, где они встречаются и т. Д.

РЕДАКТИРОВАТЬ: чтобы регистрировать все SQL-запросы в файл и т.д., тогда вам нужно будет создать промежуточное программное обеспечение. Промежуточное ПО запускается по каждому запросу. Для такого рода вещей существует несколько фрагментов Django:

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

Джон Монтгомери
источник
177

Объедините следующий фрагмент с LOGGINGполем в вашем settings.py:

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

Изменено из ответа @acardenas89

Джан Марко
источник
3
вам может потребоваться добавить следующее в handlersраздел на случай, если вы получите сообщение Невозможно добавить обработчик 'console': 'console' error: 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Дон Грем
1
Мне тоже нужен был 'version': 1,в LOGGINGдиктате.
Дэн
12
Обратите внимание, что DEBUG должен иметь значение ИСТИНА, чтобы журналы действительно регистрировались. Независимо от настроек логирования.
Janusz Skonieczny
3
Да, и еще одна вещь , в Джанго тест бегун игнорирует настройки и переопределения DEBUGдля False, поэтому в тесте вы должны@override_settings(DEBUG=True)
Януш Skonieczny
7
Я бы также добавил 'propagate': Falseпосле 'handlers': ['console'],строки, если у вас включен корневой регистратор и вы не знаете, почему он печатается дважды. Мне потребовалось немного времени, чтобы осознать.
Андрей-Никулае Петре
44

Добавьте следующие жирные инструкции в settings.py


если DEBUG:
    импорт журнала
    l = logging.getLogger ('django.db.backends')
    l.setLevel (ведение журнала.DEBUG)
    l.addHandler (logging.StreamHandler ())


РЕГИСТРАЦИЯ = {
    'версия': 1,
    disable_existing_loggers: Ложь,
    'фильтры': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'уровень': 'ОШИБКА',
            'фильтры': ['require_debug_false'],
            'класс': 'django.utils.log.AdminEmailHandler'
        }, 'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    'loggers': {
        'django.request': {
            'обработчики': ['mail_admins'],
            'уровень': 'ОШИБКА',
            'распространять': Верно,
        }, 'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'обработчики': ['консоль'],
        } ,
    }
}
  

Ресурс / Кредит

Cevaris
источник
9
Вам не нужны и ifутверждение вверху, и LOGGINGизменения. ifЗаявление, если вы хотите добавить протоколирование в то время как , например , в оболочке, чтобы включить его сразу - все , что вам нужно в settings.py это LOGGINGизменение - и Вы могли бы также хотеть django.db.backends, не sqlite3 специфичен.
М. Сомервилл,
Я не вижу никаких запросов на консоли, на которой запущен django 1.9. DEBUG = True.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Это действительно старый комментарий, очень возможно, что Django 1.9 не поддерживает это решение.
cevaris
В Django 1.9 для этого DEBUGпараметра принудительно устанавливается значение False при запуске тестов. Обходной путь - повторно включить его в тесте
Mouscellaneous
7

Чтобы регистрировать SQL-запросы во время тестирования, вам понадобятся две вещи:

  1. django.db.backends регистратор включен и
  2. @override_settings(DEBUG=True) декоратор.

Тест бегун будет установлен DEBUG = False по умолчанию, игнорируя то , что вы можете установить в DJANGO_SETTINGS_MODULE.

Минимальные настройки:

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

Пример тестового случая:

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()
Януш Сконечны
источник
2

Вам нужно всего лишь:

@override_settings(DEBUG=True)

если у вас уже есть операторы отладки SQL, которые печатаются runserver.

Добавьте декоратор в свой class TestA(TestCase)или test_function:

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

Кредиты ответу @Janusz Skonieczny!

ведант
источник
0

Вам нужно поместить это в пакет промежуточного программного обеспечения. Промежуточное ПО находится между ядром веб-сервера / django и всеми вашими представлениями. Он может выполнять предварительную обработку перед запросом и постобработку после выполнения запроса. Например, сохраните запросы в файл.

vdboor
источник