4

TB アプリで、すべての例外をログ ファイルに記録したいと考えています。というわけで、いつものように独自の sys.excepthook を使ってみました。ただし、すべての例外が引き続き発生し、何もログに記録されません。これが私のコードです:

class RootController(BaseController):
    secc = SecureController()
    error = ErrorController()

    def __init__(self):
        self.installExceptHook()
        super(RootController, self).__init__()

    def installExceptHook(self):
        def exceptHook(type, value, tb):
            logger = logging.getLogger('app')
            logger.critical(''.join(traceback.format_exception(type, value, tb)))
        sys.excepthook = exceptHook

index メソッドで ValueError を発生させると、次のようになります。

@expose('app.templates.index')
def index(self, **kwargs):
    raise ValueError
    return dict(page = 'index')

ブラウザに WebError Traceback ページがまだ表示され、何もログに記録されません。

私が間違っていることを知っていますか?何か案が?

4

1 に答える 1

2

ドキュメントから ( http://docs.python.org/2/library/sys.html#sys.excepthook ):

例外が発生してキャッチされない場合、インタープリターは Python プログラムで sys.excepthook [...] を呼び出します。これは、プログラムが終了する直前に発生します。

WebError が例外をキャッチして処理するため (アプリケーションはそのような例外から終了することさえありません)、例外はsys.excepthook呼び出されるポイントに到達しません。


full_stack = False迅速で汚い解決策として、構成で WebError ミドルウェア ( https://github.com/TurboGears/tg2/blob/tg2.2.2/tg/configuration/app_config.py#L1036 )を無効にする設定を試すことができます。もちろん、Web サーバーで失敗応答コードを処理することを意味します。

例外をログに記録するだけで、WebError デバッグ/電子メール機能を引き続き使用する場合は、カスタム ミドルウェアをセットアップし、それをアプリケーションにラップし、例外をログに記録して渡すことができます。

于 2013-08-15T07:31:14.927 に答える