あいつの日誌β

働きながら旅しています。

python で traceback を取得したい

あらすじ

以下のコードを実行すると

# -*- coding: utf-8 -*-
import logging
import traceback

try:
    raise Exception('!!')
except Exception as e:
    logging.error(e)

こういう感じになります。

:!python %
ERROR:root:!!

traceback が欲しい

import traceback

こういう書き方ができるようです。

# -*- coding: utf-8 -*-
import logging
import traceback

try:
    raise Exception('!!!')
except Exception as e:
    logging.error(traceback.format_exc())

実行結果

:!python %
ERROR:root:Traceback (most recent call last):
  File "test.py", line 6, in <module>
    raise Exception('!!!')
Exception: !!!

logging.exception

あとこういうやり方もあります

# -*- coding: utf-8 -*-
import logging

try:
    raise Exception('!!!!')
except Exception as e:
    logging.exception(e)

実行結果

:!python %
ERROR:root:!!!!
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    raise Exception('!!!!')
Exception: !!!!

logging と logger

logging モジュールからも info(), debug() といった関数が呼び出せますが基本的には logger を使ったほうが良いでしょう。

# -*- coding: utf-8 -*-
from logging import getLogger, StreamHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)

try:
    raise Exception('!!!!')
except Exception as e:
    logger.exception(e)

これぐらいの規模でしたら logging.exception(e) でも良いと思いますが logging から 直接 log() なメソッドは呼び出さないほうが良い、という覚え方でも良いのかな。

Python Logging Best Practices ~ Pieces of Mind

https://itunes.apple.com/jp/album/fly-till-i-die/id6652815?i=6652793&uo=4&at=1l3vw5g