任务:当我的一个视图中出现错误时,我需要显示自定义错误视图。错误类型无关紧要。
我尝试通过为所有异常重新绑定视图来覆盖所有异常,例如:
<view
context="Exception"
renderer="server_error.pt"
/>
它有效好。所有例外都显示了我的观点。但问题是那些错误停止了记录。在我的错误视图中,我可以执行类似logger.error(traceback)的操作,但这是一个愚蠢的想法。
如何在不破坏日志记录金字塔系统的情况下为所有错误注册视图。
答案 0 :(得分:2)
您可以通过普通的旧python日志记录在视图中记录错误。或者将响应的状态设置为500(假设您的视图现在返回状态200,表示响应成功)。
编辑:工作示例
我不是日志记录专家,但我的印象是你的developer.ini / production.ini中的日志配置会被选中,下面的例子似乎证明了这一点,但你是法官....
从默认
更改日志配置[formatter_generic]
# format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
format = y u no work??!!?? %(message)s
# End logging configuration
观点
from pyramid.view import view_config
from webob import Response
import logging
log = logging.getLogger(__name__)
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
raise ValueError("oops")
return {'project':'tstLogError'}
@view_config(context=Exception)
def exception_view(context, request):
log.error("The error was: %s" % context, exc_info=(context))
return Response(status_int=500, body=str(context))
from pyramid.view import view_config
from webob import Response
控制台输出:
serving on http://0.0.0.0:6543
y u no work??!!?? The error was: oops
Traceback (most recent call last):
File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/tweens.py", line 20, in excview_tween
response = handler(request)
File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/router.py", line 164, in handle_request
response = view_callable(context, request)
File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 333, in rendered_view
result = view(context, request)
File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 471, in _requestonly_view
response = view(request)
File "/home/twillis/projects/TestLogError/tstLogError/tstlogerror/views.py", line 8, in my_view
raise ValueError("oops")
ValueError: oops
答案 1 :(得分:2)
在您自己的错误视图中记录异常并不愚蠢(异常将以request.context
的形式提供。)与异常一样,您可以不做任何事,处理异常并记录它,或重新提出同样的例外。
在我的设置中,WSGI服务器本身记录了未捕获的异常,在本例中为wsgiref。无法触发WSGI服务器的正常响应机制及其异常记录器。
wsgiref的异常记录器:
def log_exception(self,exc_info):
"""Log the 'exc_info' tuple in the server log
Subclasses may override to retarget the output or change its format.
"""
try:
from traceback import print_exception
stderr = self.get_stderr()
print_exception(
exc_info[0], exc_info[1], exc_info[2],
self.traceback_limit, stderr
)
stderr.flush()
finally:
exc_info = None
您可以接受的另一种选择是在Web服务器层而不是金字塔层显示自定义错误页面。
答案 2 :(得分:0)
插件pyramid_exclog很好地填补了这个目的。
它作为补间实现,因此您仍然可以为Exception
编写视图,并将异常的详细信息记录到您在金字塔配置文件中指定的任何日志处理程序 - 与控制台的天气,文件或电子邮件。
除了pyramid_exclog文档之外,我还发现Python文档的Python Configuration file format部分非常有用,因为配置是非常棘手的。