Как вы регистрируете ошибки сервера на сайтах django


Итак, при игре с развитием я могу просто установить settings.DEBUG до True и если возникает ошибка, Я вижу, что она хорошо отформатирована, с хорошей трассировкой стека и запросом информации.

но на вид производственной площадки я бы предпочел использовать DEBUG=False и показать посетителям некоторые стандартные ошибки 500 страниц с информацией, что я работаю над исправлением этой ошибки в данный момент;)
В то же время я хотел бы иметь какой-то способ регистрации всей этой информации (трассировка стека и информация о запросе) в a файл на моем сервере-поэтому я могу просто вывести его на свою консоль и посмотреть прокрутку ошибок, отправлять мне журнал каждый час или что-то в этом роде.

какие решения для ведения журнала вы бы рекомендовали для django-сайта, который отвечал бы этим простым требованиям? У меня есть приложение работает как fcgi сервер и я использую веб-сервер apache в качестве интерфейса (хотя думаю о переходе на lighttpd).

6 165

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
        },
    },
}

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. Я только сейчас это реализовал, и пока возился с некоторыми 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')