2012-03-27 10 views
5

작업 : 내보기 중 하나에서 오류가 발생하면 사용자 지정 오류보기를 표시해야합니다. 오류 유형은 중요하지 않습니다. Pyramid (Python) : 기본 오류보기 덮어 쓰기

나는 이런 식으로, 모든 예외에 대한보기를 registring 모든 예외를 무시하려고 :
<view 
    context="Exception" 
    renderer="server_error.pt" 
    /> 

그것은 좋은을했다. 모든 예외는 내 견해를 보여주었습니다. 그러나 문제는 해당 오류가 로깅을 중지했습니다.. 내가 errorview에서 logger.error (traceback)와 같은 일을 할 수있는 소스의 소스,하지만이 바보 같은 생각입니다.

로깅 피라미드 시스템을 손상시키지 않고 모든 오류에 대한보기를 등록하려면 어떻게해야합니까?

+0

직접 오류를 기록하거나 오류를 다시 기록해야합니다. 오류를 다시 발생 시키면 기록되지만보기가 렌더링되지 않습니다. 보기 내에서 오류를 기록하면보기가 기록되고 렌더링됩니다. –

답변

2

일반 오래된 파이썬 로깅을 통해보기에 오류를 기록 할 수 있습니다. 또는 응답의 상태를 500으로 설정하십시오 (보기가 현재 응답을 나타내는 200의 상태를 리턴한다고 가정한다고 가정 함).

편집 : 작업 예를

내가 로깅 전문가는 아니지만이 development.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

+0

내가 말한대로 : 기본 로거 로깅은 나쁜 해결책입니다. 그렇게하면 피라미드 구성으로 기록 할 수 없습니다. statatus 코드 설정을 시도했지만 로깅 상황이 변경되지 않았습니다 (여전히 오류 없음). –

+0

당신이 말하는 것은 당신이 당신의 브라우저로 그 견해를 쳤을 때 당신의 브라우저가 HTTP_STATUS = 500를 보았지만 기록되지 않고 있다는 것입니다. 그것은 놀랍습니다. 이드는 그것을 믿어야 만합니다. –

+0

Dou! 귀하의 예제에서 당신은 그것을 스스로 기록합니다 :). 그것은 'y u no work ?? !!'와 함께 표시됩니다. 모든 출력에서 ​​sys.error에 적용되는 포맷터 구성을 변경했기 때문입니다. 하지만 여전히 고마워! 이제는 다른 방법이 없다는 것을 이해합니다. 직접 기록하고 포맷터를 적용하기 때문에 문제가되지 않는 것 같습니다. –

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 

하나의 대안.

+0

답해 주셔서 감사합니다. 내가보기에 그냥 기록 할 것처럼 보입니다. –

0

플러그인 pyramid_exclog은이 목적을 매우 잘 채 웁니다.

트위터로 구현되어 여전히 Exception에 대한보기를 작성할 수 있으며 피라미드 구성 파일에 지정한 로그 처리기 (예 : 콘솔의 날씨), 파일 또는 이메일.

pyramid_exclog 설명서 이외에도 필자는 구성이 매우 익숙하기 때문에 매우 유용한 Python 설명서의 Python Configuration file format 섹션을 발견했습니다.