現在、flask
に基づいたアプリケーションを開発しています。 app.run()
を使用して手動でサーバーを正常に起動します。私はmod_wsgi
で実行しようとしました。奇妙なことに、500エラーが発生し、ログには何も記録されません。私は少し調査しましたが、これが私の発見です。
print >>sys.stderr, "hello"
のような行の挿入は期待どおりに機能します。メッセージはエラーログに表示されます。エラーが発生するのはSQLAlchemyであり、ログ設定によってはアプリケーションのある時点でログが破棄される可能性があると私の直感が教えてくれました。
さらに、テストにはSQLiteを使用しています。私が思い出す限り、これは1つのスレッドからのみアクセスできます。そのため、mod_wsgi
がさらにスレッドを生成すると、アプリが破損する可能性があります。
mod_wsgi
の背後で実行が中断されるだけなので、私は少し困っています。これも私のエラーを飲み込んでいるようです。エラーをApache error_logにバブルアップさせるにはどうすればよいですか?
参考までに、コードを見ることができます このgithubパーマリンク上 。
私は完全に間違っていなかったことがわかりました。例外は確かにsqlalchemyによってスローされました。そして、デフォルトでstdout
にストリーミングされるため、mod_wsgi
静かにそれを無視しました(私が知る限り)。
私の主な質問に答えるには:WSGIアプリによって生成されたエラーを確認する方法は?
それは実際には非常に簡単です。ログをstderr
にリダイレクトします。あなたがする必要があるのは、WSGIスクリプトに以下を追加することだけです。
import logging, sys
logging.basicConfig(stream=sys.stderr)
現在、これは最もありふれたロギング構成です。私のアプリケーションではまだ何も配置していませんので、これで十分です。しかし、アプリケーションが成熟すると、とにかく、より洗練されたロギング構成になるので、これはあなたに噛み付かないでしょう。
ただし、迅速かつダーティーなデバッグの場合は、これで十分です。
これをconfig.py
Apacheエラーログまでエラーを伝達するのに劇的に役立ちます:
PROPAGATE_EXCEPTIONS = True
私は同様の問題を抱えていました:ログのない時折の「内部サーバーエラー」。 mod_wsgiを使用する場合は、「app.run()
」を削除する必要があります。これにより、アプリケーションをmod_wsgiにデプロイする場合、不要なローカルWSGIサーバーが常に起動されます。 docs を参照してください。これがあなたのケースであるかどうかはわかりませんが、お役に立てれば幸いです。