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

问题描述 投票:5回答:3

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

我尝试通过registring查看所有异常来覆盖所有异常,如下所示:

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

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

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

python views pyramid error-logging
3个回答
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


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服务器层而不是金字塔层显示自定义错误页面。


0
投票

插件pyramid_exclog很好地填补了这个目的。

它作为补间实现,因此您仍然可以为Exception编写视图,它会将异常的详细信息记录到您在金字塔配置文件中指定的任何日志处理程序 - 控制台,文件或电子邮件的天气。

除了pyramid_exclog文档之外,我还发现Python文档的Python Configuration file format部分非常有用,因为配置是非常棘手的。

© www.soinside.com 2019 - 2024. All rights reserved.