2012-03-27 6 views
5

タスク:自分のビューのいずれかでエラーが発生すると、私はカスタムエラービューを表示する必要があります。エラーの種類は関係ありません。Pyramid(Python):デフォルトエラービューをオーバーライド

私はこのように、すべての例外のビューをregistringことにより、すべての例外を上書きしようとした:

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

それは良いを働きました。すべての例外が私の見解を示していました。しかし、問題は、それらのエラーがログを停止したことです。私のエラービューでlogger.error(トレースバック)のようなことをすることができますが、これはダムの考えです。

ロギングピラミッドシステムを破損することなく、すべてのエラーに対してビューを登録するにはどうすればよいですか。

+0

エラーを自分で記録するか、エラーを再確認する必要があります。エラーを起こすとログに記録されますが、ビューはレンダリングされません。ビュー内でエラーを記録すると、ログに記録され、ビューがレンダリングされます。 –

答えて

2

通常のPythonロギングを使用して、ビューにエラーを記録できます。または、レスポンスのステータスを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と表示されますが、ログに記録されていません。それは驚くべきことです。 IDはそれを信じるためにそれを見なければならない。 –

+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 

一つあなたへの許容できる代替は、Webサーバー層ではなく、ピラミッド層でカスタムエラーページを表示することです。

+0

答えをありがとう。私はちょうどビューの中にそれを記録するように見えます。 –

0

プラグインpyramid_exclogは、この目的を十分に満たしています。

Exceptionのビューを書き込むことができるようにトゥイーンとして実装されています。これは、ピラミッド構成ファイルで指定したログハンドラの例外の詳細をログに記録します。または電子メール。

pyramid_exclogのドキュメントに加えて、私はPythonのConfiguration file formatというPythonドキュメントのセクションも非常に参考になっています。なぜなら設定はかなり手間がかかるからです。

関連する問題