Pythonで例外をログに記録するにはどうすればよいですか?
私はいくつかのオプションを見て、このコードを使用して実際の例外の詳細にアクセスできることがわかりました。
_import sys
import traceback
try:
1/0
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback)
_
ログに記録できるように、何らかの形で文字列print_exception()
が標準出力にスローされるようにします。
質問に答えるには、 print_exception()
関数を使用して、traceback.format_exception()
の文字列バージョンを取得できます。トレースバックメッセージは、標準出力に出力するのではなく、文字列のリストとして返されるため、必要な処理を実行できます。例えば:
import sys
import traceback
try:
asdf
except NameError:
exc_type, exc_value, exc_traceback = sys.exc_info()
lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
print ''.join('!! ' + line for line in lines) # Log it or whatever here
これは表示します:
!! Traceback (most recent call last):
!! File "<stdin>", line 2, in <module>
!! NameError: name 'asdf' is not defined
ただし、rlotunで提案されている標準のPythonロギングモジュールを使用することをお勧めします。セットアップは最も簡単なものではありませんが、非常にカスタマイズ可能です。
を見てみましょう logging.exception
( Python Logging Module )
import logging
def foo():
try:
some_code()
except:
logging.exception('')
これにより、現在の例外のトレースバックを自動的に取得し、適切に記録する必要があります。
例外のロギングは、exc_info = Trueキーワード引数を任意のログメッセージに追加するだけです。 http://docs.python.org/2/library/logging.html のLogger.debugのエントリを参照してください。
例:
try:
raise Exception('lala')
except Exception:
logging.info('blah', exc_info=True)
出力(もちろん、ログハンドラーの構成によって異なります):
2012-11-29 10:18:12,778 - root - INFO - <ipython-input-27-5af852892344> : 3 - blah
Traceback (most recent call last):
File "<ipython-input-27-5af852892344>", line 1, in <module>
try: raise Exception('lala')
Exception: lala
Python 3.5では、exc_info引数に例外インスタンスを渡すことができます。
import logging
try:
1/0
except Exception as e:
logging.error('Error at %s', 'division', exc_info=e)
まず、except句で適切な例外タイプを使用することを検討してください。次に、例外に名前を付けて、印刷できます。
try:
1/0
except Exception as e:
print e
Pythonバージョンに依存して、使用する必要があります
except Exception, e