我正在使用urlib来点击我的应用而不是浏览器,所以当发生错误时我看不到调试屏幕。将正常调试信息发送到控制台或文件的最佳方法是什么?
编辑:我已经抓住了页面的输出但是当我将它打印到屏幕上时,它充满了大量无用的HTML。我可以得到错误吗?
答案 0 :(得分:29)
这篇文章仍在热播。
我建议使用以下使用内置日志记录系统的方法之一。
同样,管理电子邮件处理程序通过管道传输异常,您可以将数据发送到控制台记录器,文件记录器或其他任何地方(单独或除了电子邮件处理程序之外)。
嗯,最简单的方法是将调试模式设置为OFF并让django通过电子邮件向您发送错误消息,因为这需要5秒钟: http://docs.djangoproject.com/en/dev/howto/error-reporting/
否则,我会写一个记录异常的中间件,但是如果你想要堆栈跟踪,那就更难了。 Here's the documentation.
import traceback
import sys
from __future__ import print_function
class ProcessExceptionMiddleware(object):
def process_exception(self, request, exception):
# Just print the exception object to stdout
print(exception)
# Print the familiar Python-style traceback to stderr
traceback.print_exc()
# Write the traceback to a file or similar
myfile.write(''.join(traceback.format_exception(*sys.exc_info())))
答案 1 :(得分:14)
如果您在本地运行开发服务器,则可以使用print
。
此外,您可以使用logging
模块并将输出重定向到stdout
。在settings.py
中添加了类似的内容:
import logging.config
logging.config.fileConfig('/path/to/logging.conf')
然后创建logging.conf文件:
[loggers]
keys=root
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
查看python documentation了解更多详情和更多示例。
答案 2 :(得分:13)
执行此操作的最佳方法是为django.requests
设置日志记录处理程序。您可以通过将LOGGING
设置添加到settings.py
文件来执行此操作。下面是一个例子:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
},
'handlers': {
'console': {
'level': 'NOTSET',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
}
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'NOTSET',
},
'django.request': {
'handlers': ['console'],
'propagate': False,
'level': 'ERROR'
}
}
}
有了这个,每次返回500响应时,您都会在终端中看到一个很好的堆栈跟踪。
有关Django实现Python记录器的更多信息,请参阅documentation about logging。
答案 3 :(得分:5)
我收到500内部服务器错误并且无法调试它,因为代码未通过浏览器访问,终端没有显示回溯。 中间件中的这段代码完全不同:
import traceback
import sys
class ProcessExceptionMiddleware(object):
def process_response(self, request, response):
if response.status_code != 200:
print '\n'.join(traceback.format_exception(*sys.exc_info()))
return response
而不是处理异常I,处理响应对象并在状态代码不是200时打印回溯,现在我可以看到导致错误的原因。在这种特殊情况下,这是一个不正确的缩进块。
Yuji's answer above和middleware documentation帮助我找到了解决方案。
答案 4 :(得分:1)
答案是创建一个django中间件来捕获所有的exeptions。
当你抓住它们时,你可以将它们重定向到你想要的任何东西。
文档在这里:
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
答案 5 :(得分:1)
好的,我认为这是一个重要的事情需要注意,因为它是2016年,许多人使用Django Rest Framework而不是标准的django表格,我浪费了2个小时来弄清楚为什么我的例外处理由一个渲染器,它永远不会到达中间件,问题的解决方案很简单。
http://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling
所以这样:
import traceback
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)
traceback.print_exc()
return response
然后在设置中定义异常处理程序:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.custom_exception_handler.custom_exception_handler'
}