आप django साइटों पर सर्वर त्रुटियों को कैसे लॉग करते हैं


175

तो, जब विकास के साथ खेल मैं सिर्फ सेट कर सकते हैं settings.DEBUGकरने के लिए Trueऔर अगर एक त्रुटि occures मैं अच्छा स्टैक ट्रेस और अनुरोध जानकारी के साथ देख सकते हैं यह ठीक से स्वरूपित,।

लेकिन उत्पादन की तरह साइट पर मैं उपयोग करना चाहते हैं DEBUG=False और आगंतुकों को कुछ मानक त्रुटि 500 ​​पेज की जानकारी के साथ दिखाऊंगा, जो कि मैं इस पल में इस बग को ठीक करने पर काम कर रहा हूं;)
उसी समय मैं किसी तरह से सभी लॉगिंग करना चाहता हूं उन सूचनाओं (स्टैक ट्रेस और रिक्वेस्ट इन्फो) को मेरे सर्वर पर एक फ़ाइल में - इसलिए मैं इसे सिर्फ अपने कंसोल पर आउटपुट कर सकता हूं और त्रुटियों को स्क्रॉल कर सकता हूं, हर घंटे मुझे लॉग इन करें या कुछ इस तरह ईमेल करें।

लॉगजीओ साइट के लिए आप कौन से लॉगिंग समाधानों को पुनः प्राप्त करेंगे, जो उन सरल आवश्यकताओं को पूरा करेंगे? मेरे पास fcgiसर्वर के रूप में चल रहा एप्लिकेशन है और मैं एपाचे वेब सर्वर को फ्रंटेंड (हालांकि लाइटटैप पर जाने की सोच रहा हूं) का उपयोग कर रहा हूं।


युद्ध के मैदान से कुछ: dlo.me/what-to-do-when-your-site-goes-viral
चेरियन

2
लॉग देखने के लिए संतरी: readthedocs.org/docs/sentry/en/latest/index.html
चेरियन

चेरियन ने जो लिंक साझा किया था, वह अब मर चुका है। यदि आप संतरी की खोज करने की कोशिश करते हैं, तो आपको उनके भुगतान, आधिकारिक उदाहरण के लिए सामग्री मिलने की संभावना है, लेकिन यहां एक स्व-होस्टेड इंस्टालेशन स्थापित करने के लिए लिंक है: docs.sentry.io/server इसके अलावा, यहाँ वर्तमान में बनाए गए रेपो: gubub .com / getentry / संतरी
लेहिस्टर

जवाबों:


103

खैर, जब DEBUG = False, Django स्वचालित रूप से ADMINSसेटिंग में सूचीबद्ध प्रत्येक व्यक्ति को किसी भी त्रुटि का एक पूर्ण ट्रेसबैक मेल करेगा , जो आपको मुफ्त में बहुत अधिक सूचनाएं प्राप्त करता है। यदि आप अधिक महीन दानेदार नियंत्रण चाहते हैं, तो आप अपनी सेटिंग्स को एक मिडलवेयर क्लास में लिख सकते हैं और जोड़ सकते हैं process_exception(), जो एक विधि को परिभाषित करता है , जिसमें उस अपवाद तक पहुंच होगी जो उठाया गया था:

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

आपकी process_exception()विधि फिर आपको जो भी प्रकार की लॉगिंग करना चाहते हैं वह कर सकती है: कंसोल पर लिखना, फ़ाइल पर लिखना, आदि।

संपादित करें: हालांकि यह थोड़ा कम उपयोगी है, आप got_request_exceptionसिग्नल के लिए भी सुन सकते हैं , जो अनुरोध प्रसंस्करण के दौरान जब भी अपवाद का सामना करना पड़ता है, तो भेजा जाएगा:

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

यह आपको अपवाद वस्तु तक पहुंच नहीं देता है, हालांकि, इसलिए मिडलवेयर विधि के साथ काम करना बहुत आसान है।


7
ध्यान दें कि logging.exception('Some message')अजगर के मानक लॉगिंग मॉड्यूल के साथ उपयोग करना एक मामूली हैंडलर में ठीक काम करता है got_request_exception, अगर आप जो करना चाहते हैं वह स्टैक निशान लॉग आउट करना है। दूसरे शब्दों में, ट्रेसबैक अभी भी उपलब्ध है got_request_exception
टीएम।

Exception process_exception में पास किया गया स्टैक ट्रेस के लिए प्रकट नहीं होता है, क्या इसे प्राप्त करने का एक तरीका है?
निक बीएल

79

Django संतरी जाने के लिए एक अच्छा तरीका है, जैसा कि पहले ही उल्लेख किया गया है, लेकिन इसे ठीक से स्थापित करने में एक अलग काम शामिल है (एक अलग वेबसाइट के रूप में)। यदि आप बस एक साधारण पाठ फ़ाइल के लिए सब कुछ लॉग इन करना चाहते हैं तो लॉगिंग कॉन्फ़िगरेशन आपके में डालने के लिएsettings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

मैं सहमत हूँ, मैं संतरी से प्यार करता हूँ! मैं इसका एक .Net पोर्ट (हाल ही में .Net परियोजनाओं पर काम कर रहा है) चाहता हूं।
ग्रोमर

1
मामले में कोई भी छोटा टाइपो काट रहा है और चिपका रहा है: अंत में "प्रचार" के बजाय "प्रचार करें"।
user1228295

3
'include_html': Trueबस ईमेल "अच्छे" नहीं बनाते हैं! इसमें सेटिंग्स और स्थानीय चर के मूल्यों सहित एक पूर्ण ट्रेसबैक शामिल है। डॉक्स के अनुसार, यह एक सुरक्षा चिंता है: docs.djangoproject.com/en/1.8/topics/log/…
थॉमस

1
मुझे उत्सुक है अगर mail_admins हैंडलर (और django.request लकड़हारा) आवश्यक है क्योंकि आपके पास 'disable_existing_loggers' है: गलत और बस इस हैंडलर (और लकड़हारा) के साथ डिफ़ॉल्ट django लॉगिंग की नकल कर रहे हैं। जब मैंने परीक्षण किया है तो मैं अपडेट करूंगा।
डायलनयुन्ग

कृपया इस उत्तर को अपडेट करें। Django1.9 परिवर्तन-लॉग से: Django के डिफ़ॉल्ट लॉगिंग कॉन्फ़िगरेशन अब 'django.request' और 'django.security' लॉगर्स को परिभाषित नहीं करता है।
नरेन्द्र-चौधरी


30

स्पष्ट रूप से जेम्स सही है, लेकिन यदि आप डेटासट में अपवादों को लॉग इन करना चाहते हैं, तो कुछ खुले स्रोत समाधान पहले से ही उपलब्ध हैं:

1) क्रैशलैग एक अच्छा विकल्प है: http://code.google.com/p/django-crashlog/

2) डीबी-लॉग एक अच्छा विकल्प है: http://code.google.com/p/django-db-log/

दोनों के बीच क्या अंतर है? लगभग कुछ भी नहीं जो मैं देख सकता हूं, इसलिए या तो एक पर्याप्त होगा।

मैंने दोनों का उपयोग किया है और वे अच्छी तरह से काम करते हैं।


15

ईएमपी के सबसे सहायक कोड सबमिशन में कुछ समय बीत चुका है। मैंने अभी इसे लागू किया है, और बग का पीछा करने की कोशिश करने के लिए कुछ मैनेजमेन्को के विकल्प के साथ घूमते हुए, मुझे इस आशय की एक चेतावनी मिली है कि मेरे वर्तमान संस्करण Django (1.5।?) के साथ एक need_debug.false फ़िल्टर अब है mail_admins हैंडलर के लिए आवश्यक।

यहाँ संशोधित कोड है:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

मुझे उत्सुक है अगर mail_admins हैंडलर (और django.request लकड़हारा) आवश्यक है, क्योंकि आपके पास 'disable_existing_loggers' है: गलत और बस इस हैंडलर (और लकड़हारा) के साथ डिफ़ॉल्ट django लॉगिंग की नकल कर रहे हैं। जब मैंने परीक्षण किया है तो मैं अपडेट करूंगा।
डायलनयुंग

1

मुझे अपनी fcgiस्क्रिप्ट से सिर्फ एक कष्टप्रद समस्या थी। यह django शुरू होने से पहले भी हुआ था। लॉगिंग की कमी बहुत दर्दनाक है। वैसे भी, एक फ़ाइल को पहले से ही पुनर्निर्देशित करने से बहुत मदद मिली:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.