Python 在使用manage.py runserver时,在Django中出现错误时将堆栈跟踪打印到标准输出
我做了一些搜索,但我想知道是否有人有一个日志配置的片段,当Django在请求过程中遇到错误时,它可以将堆栈跟踪输出到stdout(这样我就可以在终端窗口中看到它)。这是专门针对本地开发/调试的,主要是针对我执行AJAX post请求时,我必须查看Firebug中的HTML,以确定错误发生在哪一行。您可以创建一个中间件来执行此操作。下面是我在项目中使用的一个修改过的代码段:Python 在使用manage.py runserver时,在Django中出现错误时将堆栈跟踪打印到标准输出,python,django,Python,Django,我做了一些搜索,但我想知道是否有人有一个日志配置的片段,当Django在请求过程中遇到错误时,它可以将堆栈跟踪输出到stdout(这样我就可以在终端窗口中看到它)。这是专门针对本地开发/调试的,主要是针对我执行AJAX post请求时,我必须查看Firebug中的HTML,以确定错误发生在哪一行。您可以创建一个中间件来执行此操作。下面是我在项目中使用的一个修改过的代码段: class ExceptionLoggingMiddleware(object): def process_exce
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()
而不是这么多行。以您的方式,您无法对异常执行任何操作,所以我还是更喜欢我的,因为它更灵活,并且是处理文件名、行号和产生异常的代码行的一个示例。