Python 在使用manage.py runserver时,在Django中出现错误时将堆栈跟踪打印到标准输出

Python 在使用manage.py runserver时,在Django中出现错误时将堆栈跟踪打印到标准输出,python,django,Python,Django,我做了一些搜索,但我想知道是否有人有一个日志配置的片段,当Django在请求过程中遇到错误时,它可以将堆栈跟踪输出到stdout(这样我就可以在终端窗口中看到它)。这是专门针对本地开发/调试的,主要是针对我执行AJAX post请求时,我必须查看Firebug中的HTML,以确定错误发生在哪一行。您可以创建一个中间件来执行此操作。下面是我在项目中使用的一个修改过的代码段: class ExceptionLoggingMiddleware(object): def process_exce

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

您可以创建一个中间件来执行此操作。下面是我在项目中使用的一个修改过的代码段:

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

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

子类WSGI处理程序,在定义的
处理程序\u uncaught\u异常中执行任何您想要的回溯操作,并在部署时使用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的错误日志中写入回溯

另一种方法是使用日志记录。特别是在运行
/manage.py runserver
时,通过将以下内容添加到settings.py文件中,可以获得堆栈跟踪:

日志记录={
“版本”:1,
“处理程序”:{
“控制台”:{
“级别”:“调试”,
'class':'logging.StreamHandler',
},
},
“伐木工人”:{
“django.request”:{
“处理程序”:[“控制台”],
"传播":对,,
“级别”:“调试”,
}
},
}
此语法来自Django文档,可以进一步修改以增加或减少控制台日志记录量

此外,5XX响应作为错误消息发出,4XX响应作为警告消息发出


请注意,这个问题和答案有一个2013年的副本。

我有一个类似的问题,但中间件选项对我没有帮助。原因是我使用的是django jsonview 0.4.3,它提供了一个decorator,可以将字典转换为有效的json http响应,即使在修饰函数失败时也是如此,因此永远不会调用process_异常中间件方法。我检查了这个decorator的代码,它似乎试图记录这样做的错误:

...
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):
    ....
我通常用这个:

    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)

然后我使用“输出””来满足我的任何需要:打印到标准输出、发送电子邮件等等。

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

DEBUG_PROPAGATE_EXCEPTIONS = True

“终端窗口”?您正在本地运行
django-admin.py运行服务器
?是的,
manage.py运行服务器
,但这对生产也有帮助,尽管我收到电子邮件,所以问题不大。“生产”方法取决于您与Apache的集成方式,因此,您需要提供更多关于该配置的详细信息,以确保我们理解。@SLott很好,现在我将编辑该问题,专门针对本地开发。谢谢你指出这一点。在我看来,这应该是首选的方法。您可以更好地控制要使用的记录器、要记录的内容等。这是迄今为止最干净的解决方案。我建议将此答案标记为最终答案。终于找到了我想要的答案!确切地说,这似乎是最合适的答案:)+1值得一提的是,在调试了几个小时的DRF问题后,没有更多的测试/选项可供尝试,你真的救了我一天……这肯定是公认的答案,非常感谢!这与在另一个答案中使用LOGGING json项有什么区别?@Jay使用LOGGING,您可能会打开应用程序中不同位置的大量日志消息。在生产环境中,这显然是最正确的方法。但对于快速而肮脏的调试,只有打印到控制台的异常才可以。我认为这里有更好的答案,但也值得指出的是,您不妨调用
import traceback;traceback.print_exc()
而不是这么多行。以您的方式,您无法对异常执行任何操作,所以我还是更喜欢我的,因为它更灵活,并且是处理文件名、行号和产生异常的代码行的一个示例。