web-dev-qa-db-ja.com

nginx、uwsgi、flaskを使用した簡単なアプリケーションロギング/デバッグ?

危険なデバッグコンソール をオンにするつもりはありませんが、アプリケーションで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__.pyconfig.pyrun.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
26
Mittenchops

セットする config['PROPAGATE_EXCEPTIONS'] to Trueアプリを本番環境で実行していて、トレースバックをログファイルに記録する場合。 (ただし、SMTPハンドラーは試していません。)

7
plaes
  1. ハンドラーを作成したり、ロガーに追加したりする部分は、_if __name__ == '__main__'_句、つまりメインのエントリポイントにある必要があります。 _run.py_になると思います。
  2. 私はこれに答えることができるかどうかわかりません-それはあなたが望むものに依存します。 ロギングチュートリアル を見て、利用可能なさまざまなオプションを確認することをお勧めします。
  3. nginxレベルで何かを変更する必要はないと思います。

更新:キャッチされなかった例外をカバーする例外句が必要になる場合があります。

_if __name__ == '__main__':
    try:
        app.run(debug=True)
    except Exception:
        app.logger.exception('Failed')
_

これは、app.run()で発生した例外のトレースバックをログに書き込む必要があります。

2
Vinay Sajip

これは非常に古い投稿であることを私は知っていますが、私は今問題に遭遇し、解決策を見つけるのに少し時間がかかりました。 Flaskサーバーにエラーを送信します。Ubuntu14.04LTSで起動スクリプトを使用してGunicornを実行していましたが、エラーログが見つかった場所は次のとおりです。

/var/log/upstart/myapp.log

http://docs.gunicorn.org/en/stable/deploy.html#upstart

他の貧しい魂がこの状況に陥った場合に備えて。

1
Ben