15

runserver をデバッグモードで実行しているときに、Django 1.0 ですべてのエラーをコンソールまたはログファイルに 書き込むにはどうすればよいですか?

この質問に対する受け入れられた回答で説明されているように、 process_exception 関数を使用してミドルウェア クラスを使用してみました。

django サイトでサーバー エラーをログに記録するにはどうすればよいですか

一部の例外に対して process_exception 関数が呼び出されます (例: views.py の assert(False)) が、importErrors などの他のエラー (例: urs.py の import thisclassdoesnotexist) に対して process_exception が呼び出されません。私は Django/Python が初めてです。これは、実行時エラーとコンパイル時エラーの違いによるものですか? しかし、それがコンパイル時のエラーであり、そうでない場合、 runserver が文句を言うと思います。

Django のデバッグに関する Simon Willison の素晴らしいプレゼンテーション ( http://simonwillison.net/2008/May/22/debugging/ ) を見たことがありますが、私にとって適切なオプションが見つかりませんでした。

関連する場合に備えて、私は Facebook アプリを作成しています。Facebook は、Django の非常に有益な 500 ページを表示するのではなく、独自のメッセージで HTTP 500 エラーをマスクします。したがって、すべてのタイプのエラーをコンソールまたはファイルに書き込む方法が必要です。

編集:私の期待は、urls.pyに不適切なインポート(ImportError)があるときにDjangoが多くの詳細を含む500エラーページを返すことができる場合、同じ詳細をコンソールまたはファイルなしで書き込むことができるはずだということです。コードに追加の例外処理を追加する必要があります。import ステートメントの例外処理を見たことがありません。

ありがとう、ジェフ

4

5 に答える 5

6

一部の例外に対して process_exception 関数が呼び出されます (例: views.py の assert(False)) が、ImportErrors などの他のエラー (例: urs.py の import thisclassdoesnotexist) に対して process_exception が呼び出されません。私は Django/Python が初めてです。これは、実行時エラーとコンパイル時エラーの違いによるものですか?

いいえ、ビューで例外が発生した場合にのみ process_exception ミドルウェアが呼び出されるためです。

ここでDEBUG_PROPAGATE_EXCEPTIONS (Jason Baker が最初に述べたように) が必要だと思いますが、トレースバックをコンソールにダンプしたいだけなら、追加の操作 (sys.excepthook など) は必要ないと思います。

エラーに対してより複雑なことをしたい場合 (つまり、ファイルまたは DB にダンプする)、最も簡単な方法はgot_request_exception シグナルです。これは、ビューで発生したかどうかに関係なく、Django がリクエスト関連の例外に対して送信します。

django.core.handlers.BaseHandlerのget_responseおよびhandle_uncaught_exceptionメソッドは、この分野で有益な (そして簡潔な) 読み物です。

コードに例外処理を追加する必要はありません。import ステートメントの例外処理を見たことがありません。

もう少し調べてみると、完了していることがわかります (多くの場合、特定の方法で依存関係がないことを処理したい場合)。とはいえ、例外の処理方法を全体的に変更するために、追加の try-except ブロックをコード全体に散らばらなければならないのは、もちろん非常に見苦しいことです!

于 2009-03-30T04:53:02.687 に答える
2

まず、例外ログに表示されるコンパイル時のエラーはほとんどありません。Python コードに有効な構文がない場合、書き込み用にログが開かれるずっと前にコードが死んでしまいます。

Django runserver モードでは、「print」ステートメントが stdout に書き込みます。これはご覧のとおりです。ただし、これは良い長期的な解決策ではないため、当てにしないでください。

ただし、Django が Apache で実行されている場合は、使用しているプラ​​グインによって異なります。mod_python を扱うのは簡単ではありません。mod_wsgi は、強制的に stdout と stderr をログ ファイルに送信することができます。

ただし、最善の策はloggingモジュールです。urls.pyロギングを構成するには、初期化を最上位に入れます。(または、おそらく、あなたのsettings.py)

すべてのモジュールに、ログ メッセージの書き込みに使用できるロガーがあることを確認してください。

実行するすべての Web サービス呼び出しに try/except ブロックが含まれていることを確認し、例外をログに書き込みます。

于 2009-03-27T18:51:16.193 に答える
1

http://groups.google.com/group/django-nashville/browse_thread/thread/b4a258250cfa285a?pli=1

于 2009-11-13T05:24:22.497 に答える
-1

*nix システムを使用している場合は、

Python でログ (例: mylog.txt) に書き込み、コンソールで「tail -f mylog.txt」を実行します。

これは、あらゆる種類のログをほぼリアルタイムで表示する便利な方法です

于 2009-03-28T22:03:55.627 に答える