2011-11-08 9 views
19

特定のバックグラウンドファイルのエラーをチェックしたいが、標準エラーストリームはプログラムによってフォアグラウンドで制御されており、表示されます。私はloggingモジュールを使用し、出力をファイルに書き込むことができます。私はどのようにこれを使用してすべての例外、エラー、およびトレースバックを記録できるのだろうと思っていました。Pythonのロギングモジュールを使用してすべての例外とエラーをログに記録

+0

[でキャッチされない例外をログに記録する可能性のある重複Python](http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

答えて

40

例外がプログラム内にスローされたことを記録するのは悪い考えです。Pythonは通常の制御フローに対しても例外を使用するためです。

したがって、はキャッチされていません。例外を記録してください。これを行うには、例外オブジェクトがあれば、簡単にロガーのexception() methodを使用します。

はあなたが try...exceptブロック内、またはすることで、カスタム例外ハンドラをインストールすることで、スクリプトのエントリポイントをラップするか、すべてのキャッチされない例外を処理するには sys.excepthook()を再割り当て:

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

ありがとう!これはまさに私が必要としていたものです。 –

+0

'sys___ excepthook __(type、value、tb)'を 'my_handler'に追加するのは良い考えではないので、例外でデフォルトアクションを処理できますか? – troyane

+2

@Ferdinand Beyer:Neat。 str(value))、 'str(value)))'私の場合は 'ERROR - キャッチされない例外:IndexError:list範囲外のインデックスを作成し、何らかの理由で「なし」と表示します。私はどのようにして完全なトレースバックを得ることができますか? 'tb'はトレースバックオブジェクトであるようですが、' traceback.print_tb(tb) 'も' None'を吐き出します。 – bioslime

関連する問題