Как вы регистрируете ошибки сервера на сайтах Django - PullRequest
168 голосов
/ 26 октября 2008

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

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

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

Ответы [ 6 ]

99 голосов
/ 26 октября 2008

Что ж, когда 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

Однако не дает вам доступ к объекту исключения, поэтому с методом промежуточного программного обеспечения работать намного проще.

76 голосов
/ 18 июня 2011

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
        },
    },
}
40 голосов
/ 16 ноября 2010

django-db-log, упомянутый в другом ответе, был заменен на:

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

30 голосов
/ 27 октября 2008

Очевидно, что Джеймс прав, но если вы хотите регистрировать исключения в хранилище данных, есть несколько доступных решений с открытым исходным кодом:

1) CrashLog - хороший выбор: http://code.google.com/p/django-crashlog/

2) Db-Log также является хорошим выбором: http://code.google.com/p/django-db-log/

В чем разница между двумя? Я почти ничего не вижу, поэтому одного из них будет достаточно.

Я использовал оба, и они хорошо работают.

13 голосов
/ 09 октября 2013

Прошло некоторое время с момента предоставления наиболее полезного кода 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
        },
    },
}
1 голос
/ 23 августа 2016

У меня только что возникла досадная проблема с моим fcgi сценарием. Это произошло еще до того, как Джанго начал. Отсутствие лесозаготовок ооочень больно. В любом случае, перенаправление stderr в файл как первое, что очень помогло:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
...