2017-05-09 10 views
2

Pythonの3導入例外チェーンなので、この:処理されない例外でFlaskのログチェーン例外を作成するにはどうすればよいですか?

import logging 

logger = logging.getLogger(__name__) 

class MyException(Exception): 
    pass 

def blow_up(): 
    try: 
     impossible = 42/0 
    except ZeroDivisionError as zde: 
     raise MyException('Uh oh!') from zde 

try: 
    blow_up() 
except: 
    logger.exception('It blew up!') 

は、この生成されます

It blew up! 
Traceback (most recent call last): 
    File "ka-boom.py", line 10, in blow_up 
    impossible = 42/0 
ZeroDivisionError: division by zero 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "ka-boom.py", line 15, in <module> 
    blow_up() 
    File "ka-boom.py", line 12, in blow_up 
    raise MyException('Uh oh!') from zde 
MyException: Uh oh! 

をしかし、未処理の例外をフラスコビュー方式でスローされますと、__cause__がログに記録されません、デバッグが難しくなります。

私はこれを行うことができます。

@app.errorhandler(Exception) 
def better_exception_handler(error): 
    current_app.logger.exception('Whoopsie!') 
    return 'Internal server error', 500 

が、私はこのようなすべての例外を捕捉し不快に感じる、それは非常にエレガントな感じがしません。 Flaskの組み込み例外ハンドラを使用して連鎖された例外をログに記録する方法はありますか?

+0

Flaskロガーは、ロギングモジュールでログイベントを階層的に伝播しないように設定されているため、ルートロガーを「聞く」と何も得られない可能性があります。チェインされた例外またはログに記録されたすべてのイベントでのみ発生しますか? – tinproject

+0

@tinproject:ログ(あるいは少なくともコンソール)に例外があり、 'current_app.logger'に送信するすべてのものは、連鎖された例外ではありません。 –

答えて

1

使用しているPythonとFlaskのバージョンを提供できますか? Python 3.5.2とFlask 0.12.1では、あなたは何が起こるべきかを見ています。

Seaking:flask-err rdbaker $ ~/.pyenv/versions/3.5.2/bin/python app.py 
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 
[2017-05-15 12:19:52,229] ERROR in app: it blew up! 
Traceback (most recent call last): 
    File "app.py", line 21, in blow_up 
    impossible = 42/0 
ZeroDivisionError: division by zero 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "app.py", line 12, in error_out 
    blow_up() 
    File "app.py", line 23, in blow_up 
    raise MyExc('Uh oh!') from zde 
MyExc: Uh oh! 
127.0.0.1 - - [15/May/2017 12:19:52] "GET /error HTTP/1.1" 200 - 
をし、私は私のブラウザでテキスト something went wrongを参照してください。私のため localhost:5000/errorを叩く

from flask import Flask 
app = Flask(__name__) 


@app.route('/error') 
def error_out(): 
    try: 
     blow_up() 
    except: 
     app.logger.exception('it blew up!') 
     return 'something went wrong' 
    return 'everything is a-ok!' 


def blow_up(): 
    try: 
     impossible = 42/0 
    except ZeroDivisionError as zde: 
     raise MyExc('Uh oh!') from zde 


class MyExc(Exception): 
    pass 


if __name__ == "__main__": 
    app.run() 

は、コンソールに以下のように記録します。

+0

Python 3.6.1とFlask 0.12ですが、手動で 'current_app.logger'にログインすると、チェーンされた例外が実際に表示されます。私が見ていた例外は、ビューメソッドで未処理のものでした。私はこれを明確にするために私の質問を更新しました。 –

関連する問題