Как вы регистрируете ошибки сервера на сайтах django
Итак, при игре с развитием я могу просто установить settings.DEBUG
до True
и если возникает ошибка, Я вижу, что она хорошо отформатирована, с хорошей трассировкой стека и запросом информации.
но на вид производственной площадки я бы предпочел использовать DEBUG=False
и показать посетителям некоторые стандартные ошибки 500 страниц с информацией, что я работаю над исправлением этой ошибки в данный момент;)
В то же время я хотел бы иметь какой-то способ регистрации всей этой информации (трассировка стека и информация о запросе) в a файл на моем сервере-поэтому я могу просто вывести его на свою консоль и посмотреть прокрутку ошибок, отправлять мне журнал каждый час или что-то в этом роде.
какие решения для ведения журнала вы бы рекомендовали для django-сайта, который отвечал бы этим простым требованиям? У меня есть приложение работает как fcgi
сервер и я использую веб-сервер apache в качестве интерфейса (хотя думаю о переходе на lighttpd).
6 ответов:
Ну, когда
DEBUG = False
, Django автоматически отправит полную трассировку любой ошибки каждому человеку, указанному вADMINS
настройка, которая дает вам уведомления в значительной степени бесплатно. Если вы хотите более мелкозернистый контроль, вы можете написать и добавить в свои настройки класс middleware, который определяет метод с именемprocess_exception()
, который будет иметь доступ к исключению, которое было поднял:http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
код
process_exception()
затем метод может выполнять любой тип ведения журнала, который вы хотите: запись в консоль, запись в файл и т. д., прием.Edit: хотя это немного менее полезно, вы также можете слушать
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 }, }, }
очевидно, Джеймс прав, но если вы хотите регистрировать исключения в хранилище данных, уже есть несколько решений с открытым исходным кодом:
1) CrashLog является хорошим выбором:http://code.google.com/p/django-crashlog/
2) Db-Log также является хорошим выбором:http://code.google.com/p/django-db-log/
в чем разница между ними? Почти ничего из того, что я вижу, так что хватит и того, и другого.
Я использовал оба, и они хорошо работают.
прошло некоторое время с момента наиболее полезного представления кода EMP. Я только сейчас это реализовал, и пока возился с некоторыми manage.py вариант, чтобы попытаться преследовать ошибку, я получил предупреждение об устаревании в том смысле, что с моей текущей версией Django (1.5.?) фильтр require_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 }, }, }
у меня просто была раздражающая проблема с моим
fcgi
сценарий. Это произошло до того, как Джанго даже начал. Отсутствие лесозаготовок ооочень болезненно. Во всяком случае, перенаправление stderr в файл, как самое первое, очень помогло:#!/home/user/env/bin/python sys.stderr = open('/home/user/fcgi_errors', 'a')