web-dev-qa-db-ja.com

Apacheログに何もない500エラー

現在、flaskに基づいたアプリケーションを開発しています。 app.run()を使用して手動でサーバーを正常に起動します。私はmod_wsgiで実行しようとしました。奇妙なことに、500エラーが発生し、ログには何も記録されません。私は少し調査しましたが、これが私の発見です。

  • print >>sys.stderr, "hello"のような行の挿入は期待どおりに機能します。メッセージはエラーログに表示されます。
  • テンプレートを使用せずにメソッドを呼び出すと、問題なく機能します。 500エラーなし。
  • シンプルなテンプレートを使用しても問題ありません。
  • [〜#〜] but [〜#〜]データベースアクセスをトリガーするとすぐにinsideテンプレート(たとえば、クエリのループ)でエラーが発生します。

エラーが発生するのはSQLAlchemyであり、ログ設定によってはアプリケーションのある時点でログが破棄される可能性があると私の直感が教えてくれました。

さらに、テストにはSQLiteを使用しています。私が思い出す限り、これは1つのスレッドからのみアクセスできます。そのため、mod_wsgiがさらにスレッドを生成すると、アプリが破損する可能性があります。

mod_wsgiの背後で実行が中断されるだけなので、私は少し困っています。これも私のエラーを飲み込んでいるようです。エラーをApache error_logにバブルアップさせるにはどうすればよいですか?

参考までに、コードを見ることができます このgithubパーマリンク上

40
exhuma

私は完全に間違っていなかったことがわかりました。例外は確かにsqlalchemyによってスローされました。そして、デフォルトでstdoutにストリーミングされるため、mod_wsgi静かにそれを無視しました(私が知る限り)。

私の主な質問に答えるには:WSGIアプリによって生成されたエラーを確認する方法は?

それは実際には非常に簡単です。ログをstderrにリダイレクトします。あなたがする必要があるのは、WSGIスクリプトに以下を追加することだけです。

import logging, sys
logging.basicConfig(stream=sys.stderr)

現在、これは最もありふれたロギング構成です。私のアプリケーションではまだ何も配置していませんので、これで十分です。しかし、アプリケーションが成熟すると、とにかく、より洗練されたロギング構成になるので、これはあなたに噛み付かないでしょう。

ただし、迅速かつダーティーなデバッグの場合は、これで十分です。

54
exhuma

これをconfig.py Apacheエラーログまでエラーを伝達するのに劇的に役立ちます:

PROPAGATE_EXCEPTIONS = True
0
Hidden Name

私は同様の問題を抱えていました:ログのない時折の「内部サーバーエラー」。 mod_wsgiを使用する場合は、「app.run()」を削除する必要があります。これにより、アプリケーションをmod_wsgiにデプロイする場合、不要なローカルWSGIサーバーが常に起動されます。 docs を参照してください。これがあなたのケースであるかどうかはわかりませんが、お役に立てれば幸いです。

0
Daniel Lerch