2013-04-20 11 views
23

私はdangerous debugging consoleをオンにするつもりはありませんが、私のアプリケーションでは500エラーが発生しており、より深く調査するための出力が書かれていないようです。nginx、uwsgi、フラスコによる簡単なアプリケーションのロギング/デバッグ?

私はto this page on logging errorsを導いたthis exchange on the mailing listを見ました。

しかし、私はまだ、これは非常に混乱見つけ、質問のカップルを持っている:

(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)私はそこにあるオプションに圧倒されています。使用する必要があるかどうかわかりません。どのロガーを有効にして、どの設定でローカルのpythonサーバーのデバッグを複製するのですか?run.pyを実行するとstdoutになりますか?デフォルトのローカル出力ストリームは、ページ内のインタラクティブなデバッガよりも非常に便利です。誰もがnginxのデプロイメントでこれを複製してログに出力する設定に、共有できるパターンを持っていますか?

(3)フラスコレベルではなく、ログを有効にするには、/etc/nginx/sites-available/appnameファイルのnginxで変更が必要なものはありますか? Pythonは理由としてローカルで実行したとき、私は、たとえば、パッケージが動作していない、またはどこに構文エラーがあるかもしれない、またはどのような変数」doesnの取得のように具体的に、私は情報を探しています

UPDATE

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) 

私はサーバー上でフラスコを実行すると、私はこれを見ません。私はちょうどブラウザで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に、私は次の方法で真のデバッグ=を設定しようとしたことを追加します:

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 
+0

更新された質問に基づいて回答を更新しました。 –

+2

解決済みですか? – hafichuk

+0

私はしませんでした。プロダクションマシンをホストすることができませんでした、フラスコであきらめました。 – Mittenchops

答えて

2
  1. あなたはハンドラを作成部分、if __name__ == '__main__'句、すなわち、あなたのメインエントリポイントであるべきなどのロガーに追加します。私はそれがrun.pyと仮定します。
  2. 私はこれに答えることができないのですか?それはあなたが望むものによって異なります。利用可能なさまざまなオプションについては、logging tutorialをご覧ください。
  3. nginxレベルで何かを変更する必要はないと思います。

更新:あなたは、例えば、キャッチされない例外をカバーし、例外条項を持っている場合がありますログにapp.run()で発生した例外のトレースバックを書くべき

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

7

config['PROPAGATE_EXCEPTIONS']Trueを設定します。アプリを実稼働環境で実行しているときに、トレースバックをログファイルに記録する必要があります。 (私はSMTPハンドラを試していませんでした..)

1

これは非常に古い投稿であることは知っていますが、今問題に遭遇しました。 Flaskはエラーをサーバーに送信します。私はUbuntuの14.04 LTSの成り上がりのスクリプトでGunicornを実行していた、と次のように私はエラーログを発見した場所だった:

/var/log/upstart/myapp.log

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

は、念のために他のいくつかの貧しい人々の魂がで終わりますこの状況。

関連する問題