うまく動作し、時折エラーを生成するFlaskアプリケーションがあります。これは、次のように実行すると表示されますdebug=True
。
if __name__ == '__main__':
app.run(debug=True)
次のような有用なエラー メッセージが表示されます。
Traceback (most recent call last):
File "./main.py", line 871, in index_route
KeyError: 'stateIIIII'
(Lighttpd + fastcgi を使用して) 実稼働環境でアプリケーションを実行すると、これらのようなエラー メッセージがファイルに保存されます。
さまざまな StackOverflow の質問 ( http://flask.pocoo.org/docs/errorhandling/、http://docs.python.org/2/library/logging.htmlなど) を見た後; Flask メーリング リスト。いくつかのブログでは、すばらしいエラー メッセージをすべてファイルに送信するだけの簡単な方法はないようです。Python ロギング モジュールを使用してカスタマイズする必要があります。そこで、次のコードを思いつきました。
私のアプリケーションファイルの上部には、さまざまなインポートがあり、その後に次のものが続きます。
app = Flask(__name__)
if app.debug is not True:
import logging
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler('python.log', maxBytes=1024 * 1024 * 100, backupCount=20)
file_handler.setLevel(logging.ERROR)
app.logger.setLevel(logging.ERROR)
app.logger.addHandler(file_handler)
次に、各ルートのコードを try/except ステートメントに入れ、トレースバックを使用してエラーが発生した行を特定し、適切なエラー メッセージを出力します。
def some_route():
try:
# code for route in here (including a return statement)
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
app.logger.error(traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2))
return render_template('error.html')
そして、ファイルの最後でdebug=True
ステートメントを削除します。アプリケーションが本番環境で実行されている場合、アプリケーションは fastcgi サーバー (?) によって実行されているため、それを行う必要はないと思いますが。アプリケーション コードの最後の 2 行は次のようになります。
if __name__ == '__main__':
app.run()
私はこれを機能させるのに苦労しています。私が管理した最善の方法は、( app.logger.error('test message')
) を使用して単一のエラー ログ メッセージをファイルに保存することだと思いますが、その 1 つのメッセージしか出力しません。そのエラーの直後に別のエラーをログに記録しようとしても、単に無視されます。