在使用manage.py runserver时,将堆栈跟踪打印到stdout以解决Django中的错误

时间:2011-05-04 15:53:05

标签: python django

我做了一些搜索,但我想知道是否有人有一个日志配置的片段,以便让Django在stdout中输出堆栈跟踪(所以我可以在终端窗口中看到它)在遇到错误期间一个要求。这是专门用于本地开发/调试的,主要用于我执行AJAX发布请求时,我必须查看Firebug中的HTML以确定错误发生在哪一行。

6 个答案:

答案 0 :(得分:29)

另一种方法是使用 LOGGING 。具体来说,通过将以下内容添加到 settings.py 文件中,您可以在运行./manage.py runserver时获得堆栈跟踪:

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

此语法来自Django文档Configuring Logging,可以进一步修改以增加或减少控制台日志记录的数量。

此外, 5XX 响应将作为ERROR消息引发, 4XX 响应将作为WARNING消息引发。

请注意这个问题&答案有2013年重复here

答案 1 :(得分:21)

您可以创建一个中间件来执行此操作。这是我用于项目的修改后的片段:

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

将此处理程序放在Django设置的中间件部分中。

答案 2 :(得分:14)

奇怪的是没有人提到DEBUG_PROPAGATE_EXCEPTIONS设置。它不是用于生产,而是在测试/调试环境中非常容易使用。只需添加到settings.py

DEBUG_PROPAGATE_EXCEPTIONS = True

答案 3 :(得分:0)

子类WSGI处理程序,在您定义的handle_uncaught_exception中使用回溯执行任何操作,并在部署时使用您的WSGIHandler而不是django提供的WSGIHandler。

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的错误日志中写回溯

答案 4 :(得分:0)

我遇到了类似的问题,但中间件选项并没有帮助我。原因是我使用django-jsonview 0.4.3提供了一个装饰器,它将字典转换为有效的json http响应,即使装饰函数失败,也不会调用process_exception中间件方法。我检查了这个装饰器的代码,似乎它试图记录这个错误:

var maxFiles = 1;
var counter = 0;
$('#fileupload').fileupload({
    url: '/uploadUrl',
    add: function (e, data) {
        if(counter < maxFiles){
            counter++;
        }else
            return false;
    }
 });

但是,我不知道为什么,这不起作用,我的bash控制台中没有记录任何内容。我应该找出为什么会发生这种情况。与此同时,我使用了额外的装饰者:

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

然后,在我所有的json视图中:

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

答案 5 :(得分:0)

我通常使用它:

    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)

然后我使用&#34; 输出&#34;无论我需要什么:打印到标准输出,发送电子邮件等...