Подтвердить что ты не робот

Распечатайте трассировку стека на stdout при ошибках в Django при использовании run.py

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Другой метод - LOGGING. В частности, вы получаете stacktrace при запуске ./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 выражаются как сообщения ERROR, а ответы 4XX поднимаются как сообщения WARNING.

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

Ответ 3

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

DEBUG_PROPAGATE_EXCEPTIONS = True

Ответ 4

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

    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)

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

Ответ 5

Подкласс WSGI-обработчика, сделайте все, что хотите, с помощью трассировки в определенном 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

Ответ 6

У меня была аналогичная проблема, но вариант промежуточного программного обеспечения мне не помог. Причина в том, что я использую django-jsonview 0.4.3, который обеспечивает декодера, который преобразует словарь в действительный ответ json http, даже если функция декорирования не работает, поэтому метод промежуточного программного обеспечения 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):
    ....