Twisterを使用してサーバーを構築しています。サーバーエラーログも管理しています。問題は、例外をスタックの最後まで実行させると、現在の接続がクラッシュしてユーザーが切断されるため、他のすべてを取得する場合を除いて、明らかにベアをアタッチすることです。
何かを見つけたら、トレースバックを文字列として取得して、どこかに保存したり、プログラムがクラッシュしたときにPythonに出力させたりせずに、自分で印刷できるようにする方法はありますか?
トレースバックモジュールには、トレースバックを印刷および検査するためのいくつかのヘルパー関数が含まれています(たとえば、traceback.print_tb)。ただし、重要なことは、トレースバック情報自体がモジュールsysの「インタープリターグローバル」変数sys.exc_tracebackに格納されることです。 。
引用元:
http://docs.python.org/reference/compound_stmts.html#try
例外句のスイートが実行される前に、例外に関する詳細がsysモジュールの3つの変数に割り当てられます。sys.exc_typeは、例外を識別するオブジェクトを受け取ります。sys.exc_valueは例外のパラメーターを受け取ります。sys.exc_tracebackはトレースバックオブジェクトを受け取ります。
sys.exc_tracebackオブジェクトをパラメーターとしてtraceback.print_tbに渡して、except句内でトレースバックをstdoutに出力させることができます。
これを試して:
import traceback, sys
try:
# Do something that might raise an exception
open("/does not exist",'rb')
except:
traceback.print_exc( file=sys.stderr )
# Or
traceback.print_exc( file=your_open_log_file )
これでうまくいき、完全なスタックトレースも出力されます。
はい、そのためのモジュールがあります。このtraceback
モジュールには、例外情報を印刷またはフォーマットしたり、生のスタックフレームを返したりして、必要な処理を実行できるようにする関数が含まれています。
ただし、かなり洗練されたアプリケーションの場合は、実際には、単純な古いtraceback
関数の代わりにログシステムを使用することをお勧めします。特に、このメソッドlogging.Logger.exception
は、ユーザー(またはソフトウェアのユーザー)が構成したログの宛先に例外に関する情報を書き込みます。Formatter
デフォルトのフォーマッターは、Pythonがコンソールで行うように、トレースバックを出力するだけですが、メソッドを作成してオーバーライドすることにより、ログ内の例外の表示をカスタマイズできますformat_exception
。オーバーライドされたメソッドはtraceback
、例外出力をフォーマットするために関数が必要な場合に関数を呼び出す場所です。