危険なデバッグコンソール をオンにするつもりはありませんが、アプリケーションで500エラーが発生し、より深く調査するための出力を書き込んでいないようです。
私は メーリングリストのこの交換 を見ました、それは私を導きました ログエラーに関するこのページに 。
しかし、私はまだこれが非常に紛らわしいと感じており、いくつかの質問があります:
(1)以下のものはどのファイルに入れるべきですか?
ADMINS = ['[email protected]']
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler('127.0.0.1',
'[email protected]',
ADMINS, 'YourApplication Failed')
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
...より大きなアプリケーションの「大きくなる」ファイルパターンを想定していますか? __init__.py
? config.py
? run.py
?
(2)そこにあるオプションに圧倒され、どちらを使うべきかわからない。 run.pyを実行するとstdoutに到達するローカルpythonサーバーデバッグ)を複製するには、どのロガーをどの設定でオンにする必要がありますか?デフォルトのローカル出力ストリームは非常に便利です。ページ内のインタラクティブデバッガーよりもそうです。nginxデプロイメントでこれを複製してログに出力するものをセットアップするときに共有できるパターンを誰かが持っていますか?
(3)ロギングを有効にするために、flaskレベルではなく、nginx、たとえば/etc/nginx/sites-available/appname
ファイルで変更する必要があるものはありますか?
具体的には、pythonがローカルで実行されたときに、パッケージが機能しない理由、構文エラーが発生する可能性がある場所、変数が機能しないなどの情報を探しています。 tが存在します:
$ python run.py
Traceback (most recent call last):
File "run.py", line 1, in <module>
from myappname import app
File "/home/me/myappname/myappname/__init__.py", line 27, in <module>
file_handler.setLevel(logging.debug)
File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
self.level = _checkLevel(level)
File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel
raise TypeError("Level not an integer or a valid string: %r" % level)
サーバーでflaskを実行すると、これは表示されません。ブラウザでuWSGIエラーが発生するだけで、どのコードに問題があるのかわかりません。上記のようなものが必要です。ファイルに書き込まれます。
また、次のログを設定しても、ログをDEBUGレベルまで上げても、ファイルにはあまり書き込まれませんでした。
from logging import FileHandler
file_handler = FileHandler('mylog.log')
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
アプリケーションがエラーになった場合でも、mylog.log
は空白です。
また、__init__.py
で、次の方法でdebug = Trueを設定しようとしたことも追加します。
app = Flask(__name__)
app.debug = True
app.config['DEBUG'] = True
from werkzeug.debug import DebuggedApplication
app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
app.config.from_object('config')
app.config.update(DEBUG=True)
app.config['DEBUG'] = True
if __name__ == '__main__':
app.run(debug=True)
Config.pyファイルにある間、私は...
debug = True
Debug = True
DEBUG = True
それでも、デバッグは行われず、ロギングまたはデバッグがなければ、これを追跡するのはかなり困難です。エラーは、役に立たないブラウザメッセージでアプリケーションを終了するだけです。
uWSGI Error
Python application not found
セットする config['PROPAGATE_EXCEPTIONS']
to True
アプリを本番環境で実行していて、トレースバックをログファイルに記録する場合。 (ただし、SMTPハンドラーは試していません。)
if __name__ == '__main__'
_句、つまりメインのエントリポイントにある必要があります。 _run.py
_になると思います。nginx
レベルで何かを変更する必要はないと思います。更新:キャッチされなかった例外をカバーする例外句が必要になる場合があります。
_if __name__ == '__main__':
try:
app.run(debug=True)
except Exception:
app.logger.exception('Failed')
_
これは、app.run()
で発生した例外のトレースバックをログに書き込む必要があります。
これは非常に古い投稿であることを私は知っていますが、私は今問題に遭遇し、解決策を見つけるのに少し時間がかかりました。 Flaskサーバーにエラーを送信します。Ubuntu14.04LTSで起動スクリプトを使用してGunicornを実行していましたが、エラーログが見つかった場所は次のとおりです。
/var/log/upstart/myapp.log
http://docs.gunicorn.org/en/stable/deploy.html#upstart
他の貧しい魂がこの状況に陥った場合に備えて。