金字塔(Python):覆盖默认错误视图

时间:2012-03-27 12:07:43

标签: python views pyramid error-logging

任务:当我的一个视图中出现错误时,我需要显示自定义错误视图。错误类型无关紧要。

我尝试通过为所有异常重新绑定视图来覆盖所有异常,例如:

<view
    context="Exception"
    renderer="server_error.pt"
    />

它有效。所有例外都显示了我的观点。但问题是那些错误停止了记录。在我的错误视图中,我可以执行类似logger.error(traceback)的操作,但这是一个愚蠢的想法。

如何在不破坏日志记录金字塔系统的情况下为所有错误注册视图。

3 个答案:

答案 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

browser screenshot

答案 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部分非常有用,因为配置是非常棘手的。