2010-12-07 3 views
40

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

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

from django.db import connection 
connection.queries 

войти все в один файл?

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

+0

http://stackoverflow.com/questions/1074212/how-to-show-the-sql-django-is-running – 2017-04-18 06:25:15

ответ

11

Может проверить https://github.com/django-debug-toolbar/django-debug-toolbar

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

EDIT: для регистрации всех SQL-запросов в файл и т. Д., Тогда вам нужно создать некоторое промежуточное программное обеспечение. Middleware запускается по каждому запросу. Есть несколько Джанго фрагментов пользовательского там для такого рода вещи:

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

+0

Спасибо. Я знаю о панели инструментов отладки. Но я хочу регистрировать все (все страницы) в одном файле. – 2010-12-07 12:01:50

0

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

35

Добавьте следующие смелые заявления в settings.py

 

if DEBUG: 
    import logging 
    l = logging.getLogger('django.db.backends') 
    l.setLevel(logging.DEBUG) 
    l.addHandler(logging.StreamHandler()) 
 

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     },'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     },'django.db.backends.sqlite3': { 
      'level': 'DEBUG', 
      'handlers': ['console'], 
     }, 
    } 
} 
   

Resource/Credit

+8

Вам не нужно как оператор `if` вверху, так и изменения` LOGGING`. Оператор `if` предназначен для того, если вы хотите добавить регистрацию, пока, например, в оболочке, чтобы немедленно включить его - все, что вам нужно в settings.py, это изменения «LOGGING», и вам может понадобиться «django.db.backends», а не конкретный sqlite3. – 2013-05-29 10:30:07

+0

Я не вижу никаких запросов на консоли, на которой запущен django 1.9. `DEBUG = True`. – 2016-05-19 12:44:39

67

Объедините следующий фрагмент с полем LOGGING d в вашем 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 ответ