सभी sql क्वेरी लॉग करें


98

मैं उन सभी एसक्यूएल प्रश्नों को कैसे लॉग कर सकता हूं जो मेरे django एप्लिकेशन ने किए थे?

मैं सब कुछ लॉग करना चाहता हूं, जिसमें व्यवस्थापक साइट से एसक्यूएल भी शामिल है। मैंने इस सवाल और एक सामान्य प्रश्न का उत्तर देखा, लेकिन मुझे अभी भी यह पता नहीं चल सका है कि मुझे कहाँ रखना चाहिए

from django.db import connection
connection.queries

एक फ़ाइल के लिए सब कुछ लॉग इन करें?

तो मेरा सवाल है - मुझे एक फ़ाइल (ऑल-स्क्वैल्.लॉग) कहने के लिए क्या करना चाहिए जहाँ सभी एसक्यूएल स्टेटमेंट लॉग होते हैं?


जवाबों:


19

शायद बाहर की जाँच करें https://github.com/django-debug-toolbar/django-debug-toolbar

यह आपको दिए गए पृष्ठ द्वारा उत्पन्न सभी प्रश्नों को देखने देगा। साथ ही जहां वे होते हैं, वहां के स्टैकट्रैक्स।

संपादित करें: सभी SQL प्रश्नों को एक फ़ाइल आदि में लॉग इन करने के लिए, फिर आप कुछ मिडलवेयर बनाना चाहेंगे। मिडलवेयर हर अनुरोध पर चलता है। इस तरह की चीज़ों के लिए कई Django स्निपेट हैं:

उन लोगों का संबंध टर्मिनल की छपाई से है, लेकिन अजगर की लॉगिंग लाइब्रेरी का उपयोग करने के लिए उन्हें अनुकूलित करना कठिन नहीं होगा।


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':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
डॉन Grem

1
मुझे हुकुम 'version': 1,में भी जरूरत थी LOGGING
डैन

12
कृपया ध्यान दें कि वास्तव में लॉग होने के लिए DEBUG को TRUE होना चाहिए । लॉगिंग सेटिंग्स के बावजूद।
Janusz Skonieczny

3
ओह, और एक और बात के लिए django टेस्ट रनर सेटिंग को अनदेखा करता है और ओवरराइड DEBUGकरता है False, इसलिए टेस्ट में आपको चाहिए@override_settings(DEBUG=True)
Janusz Skonieczny

7
मैं लाइन के 'propagate': Falseबाद भी जोड़ूंगा 'handlers': ['console'],, यदि आपके पास एक रूट लॉगर सक्षम है और पता नहीं है कि यह दो बार क्यों प्रिंट करता है। महसूस करने के लिए मुझे थोड़ा सा लिया।
आंद्रेई-निकुले पेट्रे

44

Settings.py में निम्न बोल्ड स्टेटमेंट जोड़ें


यदि DEBUG:
    आयात लॉगिंग
    l = logging.getLogger ('django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


लॉगिंग = {
    'संस्करण 1,
    'disable_existing_loggers': गलत,
    'फिल्टर': {
        'requirement_debug_false': {
            '()': 'django.utils.log.equireDebugFalse'
        }
    },
    'हैंडलर': {
        'mail_admins': {
            'स्तर': 'त्रुटि',
            'फ़िल्टर्स': ['requirement_debug_false'],
            'वर्ग': 'django.utils.log.AdminEmailHandler'
        }, 'कंसोल': {
            'स्तर': 'DEBUG',
            'वर्ग': 'logging.StreamHandler',
        } ,
    },
    'लकड़हारे': {
        'django.request': {
            'हैंडलर': ['mail_admins'],
            'स्तर': 'त्रुटि',
            'प्रचार': सच,
        }, 'django.db.backends.sqlite3': {
            'स्तर': 'DEBUG',
            'हैंडलर': ['कंसोल'],
        } ,
    }
}
  

संसाधन / क्रेडिट


9
आपको ifशीर्ष और LOGGINGपरिवर्तनों दोनों पर वक्तव्य की आवश्यकता नहीं है । ifबयान आप खोल में रहते हुए जैसे लॉगिंग जोड़ना चाहते हैं, तो तुरंत चालू करने के लिए के लिए पर है - तुम सब settings.py में की जरूरत है LOGGINGपरिवर्तन - और आप अच्छी तरह से चाहते हो सकता है django.db.backends, नहीं sqlite3 विशिष्ट एक।
एम सोमरविले

मुझे django 1.9 को चलाने वाले कंसोल पर कोई प्रश्न नहीं दिखता है। DEBUG = True
सिरो सेंटिल्ली 郝海东 i iro i

1
@CiroSantilli 巴拿馬 文件 事件 法轮功 is यह एक बहुत पुरानी टिप्पणी है, बहुत संभवतः Django 1.9 इस समाधान का समर्थन नहीं करता है।
केवरिस

Django 1.9 में, DEBUGपरीक्षण चलाने पर सेटिंग को गलत होने के लिए मजबूर किया जाता है। वर्कअराउंड इसे टेस्ट में फिर से सक्षम करना है
Mouscellaneous


7

परीक्षण के दौरान SQL प्रश्नों को लॉग करने के लिए, आपको दो चीजों की आवश्यकता है:

  1. django.db.backends लकड़हारा सक्षम और
  2. @override_settings(DEBUG=True) डेकोरेटर।

परीक्षण धावक डिफ़ॉल्ट रूप से DEBUG = गलत सेट करेगा , जिसे अनदेखा करते हुए आपने DJANGO_SETTINGS_METULE में सेट किया हो सकता है।

न्यूनतम सेटिंग्स:

# 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 कोर और आपके सभी विचारों के बीच बैठता है। यह अनुरोध से पहले प्रीप्रोसेसिंग कर सकता है, और अनुरोध पूरा होने के बाद पोस्टप्रोसेसिंग कर सकता है। उदाहरण के लिए, क्वेरीज़ को किसी फ़ाइल में सहेजें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.