سؤال

لذلك ، عند اللعب مع التطوير ، يمكنني فقط ضبطه settings.DEBUG إلى True وإذا حدث خطأ ، يمكنني رؤيته منسقة بشكل جيد ، مع تتبع مكدس جيد وطلب المعلومات.

لكن على نوع الإنتاج ، أفضل استخدامه DEBUG=False وأظهر للزائرين بعض صفحة الأخطاء القياسية 500 مع المعلومات التي أعمل عليها على إصلاح هذا الخطأ في هذه اللحظة ؛)
في الوقت نفسه ، أرغب في الحصول على ما لتسجيل كل هذه المعلومات (تتبع المكدس وطلب المعلومات) إلى ملف على الخادم الخاص بي - حتى أتمكن من إخراجها فقط كل ساعة أو شيء من هذا القبيل.

ما هي حلول التسجيل التي ستوصي بها لموقع Django ، والتي من شأنها أن تلبي تلك المتطلبات البسيطة؟ لدي التطبيق يعمل باسم fcgi الخادم وأنا أستخدم Apache Web Server كواجهة أمامية (على الرغم من التفكير في الذهاب إلى LightTPD).

هل كانت مفيدة؟

المحلول

كذلك عندما 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

هذا لا ليس تمنحك إمكانية الوصول إلى كائن الاستثناء ، وبالتالي فإن طريقة الوسيطة أسهل بكثير في العمل معها.

نصائح أخرى

تعتبر Django Sentry طريقة جيدة للذهاب ، كما ذكرنا سابقًا ، ولكن هناك القليل من العمل المشارك في إعداده بشكل صحيح (كموقع منفصل). إذا كنت ترغب فقط في تسجيل كل شيء إلى ملف نصي بسيط ، فإليك تكوين التسجيل لوضعه 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
        },
    },
}

تم استبدال Django-DB-log ، المذكورة في إجابة أخرى ، بـ:

https://github.com/dcramer/django-sentry

من الواضح أن جيمس صحيح ، ولكن إذا كنت ترغب في تسجيل استثناءات في مخزن البيانات ، فهناك بعض حلول المصادر المفتوحة المتاحة بالفعل:

1) Crashlog هو خيار جيد: http://code.google.com/p/django-crashlog/

2) DB-log هو خيار جيد أيضًا: http://code.google.com/p/django-db-log/

ما الفرق بين الاثنين؟ لا شيء تقريبا يمكنني رؤيته ، لذلك أي واحد سوف يكفي.

لقد استخدمت كلاهما ويعملون بشكل جيد.

لقد مر بعض الوقت منذ تقديم رمز EMP الأكثر فائدة. لقد قمت الآن بتطبيقه الآن ، وبينما كنت أتجول مع بعض خيار إدارة. مطلوب لمعالج 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
        },
    },
}

لقد واجهت مشكلة مزعجة مع fcgi النصي. لقد حدث قبل أن يبدأ Django. عدم وجود تسجيل مؤلم للغاية. على أي حال ، فإن إعادة توجيه STDERR إلى ملف كأول شيء ساعد كثيرًا:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top