كيف تقوم بتسجيل أخطاء الخادم على مواقع Django
-
04-07-2019 - |
سؤال
لذلك ، عند اللعب مع التطوير ، يمكنني فقط ضبطه 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 ، المذكورة في إجابة أخرى ، بـ:
من الواضح أن جيمس صحيح ، ولكن إذا كنت ترغب في تسجيل استثناءات في مخزن البيانات ، فهناك بعض حلول المصادر المفتوحة المتاحة بالفعل:
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')