Python のデバッグ情報でエラーをログに記録する

Najwa Riyaz 2023年1月30日
  1. Python で exception() メソッドを使用して詳細なデバッグ情報を含むエラーをログに記録する
  2. Python 3.2 以降の詳細なデバッグ情報で stack_infoexception() メソッドを使用してエラーをログに記録する
  3. Python 3.5 以降の詳細なデバッグ情報で exc_infoexception() メソッドを使用してエラーをログに記録する
Python のデバッグ情報でエラーをログに記録する

この記事では、Python で詳細なデバッグ情報を使用してエラーをログに記録する方法について説明します。

詳細なデバッグ情報を表示するには、Python で logging ライブラリをインポートし、logging.exception() メソッドを利用します。エラーメッセージとスタックトレースが表示されます。

例外文字列は、Python で発生した正確なエラーを理解するのに役立つことがわかっています。これとは別に、例外と例外を生成したコード行に関する詳細情報を特定できます。

except コードブロック内で logging.exception() メソッドを呼び出します。これは、エラーメッセージとともにスタックトレースを表示するのに役立ちます。このロガーでは、レベル ERROR でメッセージをログに記録します。例外情報がログメッセージに追加されます。

Python で exception() メソッドを使用して詳細なデバッグ情報を含むエラーをログに記録する

これは、Python で詳細なデバッグ情報を使用してエラーをログに記録する方法を示す例です。

import logging


def fnc_divide(n):
    try:
        result = n / 0
        print("The result=", result)

    except:
        print("The except block")
        logging.exception("The detailed error message -")


fnc_divide(5)

出力:

The except block
ERROR:root:The detailed error message -
Traceback (most recent call last):
  File "C:/Users/../a.py", line 4, in fnc_divide
    result=n/0
ZeroDivisionError: division by zero

出力には、以下に示すエラーに関する詳細情報が表示されていることに注意してください。

  • エラーが発生したモジュール/機能について言及しています。この例では、出力は、fnc_divide() メソッド内でエラーが発生したことを示しています。
  • エラーが発生した行番号が記載されています。この例では、出力はエラーが行番号 4 で発生したことを示しています。
  • 正確なエラーについて言及しています。この例では、ZeroDivisionError: division by zero です。

Python 3.2 以降の詳細なデバッグ情報で stack_infoexception() メソッドを使用してエラーをログに記録する

Python 3.2 以降では、stack_info 引数を True として渡すことができます。これは、コードの特定のポイントに到達した方法を示しています。これは、例外が発生しない場合にも当てはまります。

stack_infoTrue の場合、スタック情報はロギングメッセージと実際のロギング呼び出しに追加され、スタックフレームに順番に関連付けられます。順序は、スタックの最下位から現在のスレッドのロギング呼び出しまでです。

以下のこのサンプルコードを見てください。

import logging


def fnc_dividestack(n):
    try:
        result = n / 0
    except Exception:
        logging.exception("The detailed error message -", stack_info=True)


fnc_dividestack(4)

出力:

ERROR:root:The detailed error message -
Traceback (most recent call last):
  File "C:/Users/Ri..error.py", line 5, in fnc_dividestack
    result=n/0
ZeroDivisionError: division by zero
Stack (most recent call last):
  File "C:/Users/Ri..error.py", line 9, in <module>
    fnc_dividestack(4)
  File "C:/Users/Ri..error.py", line 7, in fnc_dividestack
    logging.exception("The detailed error message -", stack_info=True)

Python 3.5 以降の詳細なデバッグ情報で exc_infoexception() メソッドを使用してエラーをログに記録する

Python 3.5 以降では、exc_info 引数で例外インスタンスを渡すことができます。このパラメーターは、例外インスタンスを受け入れます。

例外が発生した場合、exc_info タプルは現在の例外情報を保持することに注意してください。それ以外の場合は、None を保持します。以下は、このプロセスを示す例です。

import logging


def fnc_divide(n):
    try:
        result = n / 0
        print("The result=", result)

    except Exception as e:
        logging.exception("The exc_info - Zero Division error", exc_info=e)


fnc_divide(5)

出力:

ERROR:root:The exc_info - Zero Division error
Traceback (most recent call last):
  File "C:/Users/R..ror.py", line 4, in fnc_divide
    result=n/0
ZeroDivisionError: division by zero

関連記事 - Python Logging