Python でスタックトレースを出力する

Muhammad Waiz Khan 2023年1月30日
  1. Python で traceback モジュールを使用してスタックトレースを出力する
  2. Python で logging.exception() メソッドを使用してスタックトレースを出力する
Python でスタックトレースを出力する

このチュートリアルでは、Python でのプログラムの実行を停止せずに、スタックトレースを出力するためのさまざまなメソッドを調べます。

スタックトレースには、特定の時間にアクティブなメソッド呼び出しのリストが含まれています。次の方法を使用して、Python でスタックトレースを出力できます。

Python で traceback モジュールを使用してスタックトレースを出力する

traceback モジュールは、Python でスタックトレースを抽出、フォーマット、および出力する機能を提供します。traceback.format_exc() メソッドは、traceback オブジェクトからの例外およびスタックトレースエントリに関する情報を含む文字列を返します。

format_exc() メソッドを使用して、try および except ステートメントでスタックトレースを出力できます。以下のサンプルコードは、Python で traceback.format_exc() メソッドを使用してスタックトレースを出力する方法を示しています。

import traceback
import sys

try:
    myfunction()
except Exception:
    print(traceback.format_exc())

出力:

Traceback (most recent call last):
  File "C:\Test\test.py", line 5, in <module>
    myfunction()
NameError: name 'myfunction' is not defined

print() 関数を使用する代わりに、logger.debug() メソッドを使用して出力をログに記録することもできます。ログを記録するとデバッグが容易になるためです。次のメソッドで logger.debug() メソッドを使用すると、Python でスタックトレースをログに記録できます。

import logging
import traceback

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

try:
    myfunction()
except Exception:
    logger.debug(traceback.format_exc())

出力:

DEBUG:__main__:Traceback (most recent call last):
  File "C:\Test\test.py", line 8, in <module>
    myfunction()
NameError: name 'myfunction' is not defined

Python で logging.exception() メソッドを使用してスタックトレースを出力する

logging モジュールの logging.exception() メソッドを使用して、Python でスタックトレースを取得することもできます。logging.exception() メソッドは、例外情報を含むメッセージをログに記録します。これを使用して、Python でスタックトレースを次のように出力できます。

import logging
import traceback

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

try:
    myfunction()
except Exception:
    logging.info("General exception noted.", exc_info=True)

出力:

INFO:root:General exception noted.
Traceback (most recent call last):
  File "C:\Test\test.py", line 8, in <module>
    myfunction()
NameError: name 'myfunction' is not defined