Вывести трассировку стека в стандартный вывод ошибок в Django при использовании runserver manage.py - PullRequest
17 голосов
/ 04 мая 2011

Я провел некоторый поиск, но мне интересно, есть ли у кого-нибудь фрагмент конфигурации регистрации, чтобы Django просто выводил трассировку стека в stdout (чтобы я мог видеть его в окне терминала), когда он сталкивается с ошибкой во время запрос. Это специально для локальной разработки / отладки и, в основном, когда я делаю AJAX-пост-запросы и мне нужно посмотреть на HTML в Firebug, чтобы выяснить, в какой строке произошла ошибка.

Ответы [ 6 ]

29 голосов
/ 23 мая 2014

Другой метод с LOGGING .В частности, вы получаете трассировку стека при запуске ./manage.py runserver, добавив в файл settings.py следующее:

LOGGING = {
    'version': 1,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers':['console'],
            'propagate': True,
            'level':'DEBUG',
        }
    },
}

Этот синтаксис взят из документации Django Настройка ведения журнала и может быть дополнительно изменен, чтобы увеличить или уменьшить количество консольного журнала.

Также ответы 5XX выдаются как сообщения об ОШИБКЕ, а ответы 4XX выдаются как сообщения ПРЕДУПРЕЖДЕНИЕ.

Обратите внимание, что этот вопрос и ответ имеетДубликат 2013 года здесь .

21 голосов
/ 04 мая 2011

Вы можете создать часть промежуточного программного обеспечения для этого. Вот модифицированный фрагмент, который я использую для проекта:

class ExceptionLoggingMiddleware(object):
    def process_exception(self, request, exception):
        import traceback
        print traceback.format_exc()

Поместите этот обработчик в вашу промежуточную часть настроек Django.

14 голосов
/ 21 февраля 2016

Странно, что никто не упомянул настройку DEBUG_PROPAGATE_EXCEPTIONS. Он не для производства, но очень прост в использовании в среде тестирования / отладки. Просто добавьте к settings.py:

DEBUG_PROPAGATE_EXCEPTIONS = True
0 голосов
/ 26 августа 2015

Я обычно использую это:

    except Exception,e:
        # Get line
        trace=traceback.extract_tb(sys.exc_info()[2])
        # Add the event to the log
        output ="Error in the server: %s.\n" % (e)
        output+="\tTraceback is:\n"
        for (file,linenumber,affected,line)  in trace:
            output+="\t> Error at function %s\n" % (affected)
            output+="\t  At: %s:%s\n" % (file,linenumber)
            output+="\t  Source: %s\n" % (line)
        output+="\t> Exception: %s\n" % (e)

Затем я использую " output " для всего, что мне нужно: распечатать на стандартный вывод, отправить электронное письмо и т. Д ...

0 голосов
/ 13 мая 2015

У меня была похожая проблема, но опция промежуточного программного обеспечения мне не помогла. Причина в том, что я использую django-jsonview 0.4.3, который предоставляет декоратор, который преобразует словарь в действительный http-ответ json, даже когда декорированная функция завершается ошибкой, поэтому метод промежуточного программного обеспечения process_exception никогда не вызывается. Я проверил код этого декоратора, и кажется, что он пытается записать ошибку, делая это:

...
except Exception as e:
    logger = logging.getLogger('django.request')
    logger.exception(unicode(e))

Однако я не знаю почему, это не работает, и в моей консоли bash ничего не регистрируется. Я должен выяснить, почему это происходит. Тем временем я использую дополнительный декоратор:

def log_errors(func):
    if not settings.DEBUG:
        return func

    def wrapper(request, *args, **kwargs):
        try:
            return func(request, *args, **kwargs)
        except:
            print traceback.format_exc()
    return wrapper

Тогда во всех моих представлениях json:

@json_view
@log_errors
def my_view(request):
    ....
0 голосов
/ 04 мая 2011

Обработчик подкласса WSGI, делайте все, что вы хотите с traceback в вашем определенном handle_uncaught_exception, и используйте ваш WSGIHandler вместо того, который предоставляется django при развертывании.

import traceback
from django.core.handlers.wsgi import WSGIHandler

class MyWSGIHandler(WSGIHandler):
    """WSGI Handler which prints traceback to stderr"""
    def handle_uncaught_exception(self, request, resolver, exc_info):
        traceback.print_tb(exc_info[2], file=sys.stderr)
        return super(WSGIHandler, self).handle_uncaught_exception(request, resolver, exc_info)

При использовании с Apache / mod_wsgi, это должно записывать трассировку в журнал ошибок Apache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...