Cou氏の徒然日記

ほのぼの日記ブログです。

Python3の学習 その22 (traceback:スタックトレース, logging:ログ出力)

Python

今回はtracebackについて。

Pythonソースのスタックトレースを出力には、tracebackモジュールを使えばよいようです。

 

■ tracebackモジュール

まずは今回テストする関数を作成。

単純に例外を起こすために、0除算のケースを作成してみます。

import traceback

def divide(a, b):
    return a / b

try:
    divide(2, 0)
except ZeroDivisionError:
    print('ZeroDivisionError happened!')
    traceback.print_exc()

「0」で除算すると「ZeroDivisionError」の例外が発生するので、これをキャッチ。

発生が分かるように、メッセージ出力と、トレースログを出してみます。

トレースロスは

traceback.print_exc()

を実行すればよいようです。

実際に実行してみると…

coublood@penguin:~/python$ python3 tracebk1.py 
ZeroDivisionError happened!
Traceback (most recent call last):
  File "/home/coublood/python/tracebk1.py", line 7, in <module>
    divide(2, 0)
  File "/home/coublood/python/tracebk1.py", line 4, in divide
    return a / b
           ~~^~~
ZeroDivisionError: division by zero

メッセージも出ており、スタックトレースも出ていますね。

a / b で割る処理で出ているのが期待値で、呼び出し元も出ているので、期待通りです。

 

■ loggingモジュール

ついでに上記のエラーを特定のフォーマットでログ出力したいので、今度はログ出力について。

ログ出力はloggingモジュールで良いようです。

import traceback
import logging

logFileName = '/home/coublood/python/traceback1.log'
logFormat = '%(asctime)s %(levelname)s %(message)s'
logging.basicConfig(filename=logFileName, format=logFormat)

def divide(a, b):
    return a / b

try:
    divide(2, 0)
except ZeroDivisionError:
    print('ZeroDivisionError happened!')
    logging.error(traceback.format_exc())

 

basicConfig関数で引数等で色々と基本設定できるみたいで、それはマニュアルを参照すれば色々と載ってました。

coublood@penguin:~/python$ cat traceback.log 
2024-12-31 21:25:22,850 ERROR Traceback (most recent call last): File "/home/coublood/python/tracebk1.py", line 12, in <module> divide(2, 0) File "/home/coublood/python/tracebk1.py", line 9, in divide return a / b ~~^~~ ZeroDivisionError: division by zero

時間も簡単に出せるので、ロガーとして全然これで十分ですね。

 

[blog:g:8599973812282040707:banner]

[blog:g:11696248318756355058:banner]

[blog:g:11696248318754550880:banner]