結論
some.py
import sys
import traceback
from some_module import some_func
def some_some():
try:
some_process...
some_val = some_func() # エラーが起こる処理 -> さらに some_func()で呼んでいるsome_blah_func()でraiseしてるとする
except Exception as e:
t, v, tb = sys.exc_info()
print(traceback.format_tb(tb)[-1]) # <-大元のエラー箇所を出力する
すると出力はこんな感じ。
some_container | File "/some_path/some_blah_module.py", line 30, in some_blah_func
some_container | raise
解説
sys.exc_info()の中にはこんな感じに例外オブジェクトの情報がある
.py
type, value, tb = sys.exc_info()
print(type)
print(value)
print(tb)
↓
some_container | <class 'RuntimeError'>
some_container | No active exception to reraise
some_container | <traceback object at xxxxxxxx>
なので、traceback.format_tbに、ここで取得したtracebackを食わせると…
.py
print(traceback.format_tb(tb))
some_container | [' File "/some_path/some.py", line 10, in some_some\n some_val = some_func()\n', ' File "/some_path/some_moduile.py", line 20, in some_func\n some_val2 = some_blah_func()\n', ' File "/some_path/some_blah_module.py", line 30, in some_blah_func\n raise\n']
こんな感じ。
要するに、traceback.format_tb(tb)には、遡って各エラー箇所がリストで入っている。
なので、以下で大元をprintできる。
.py
t, v, tb = sys.exc_info()
print(traceback.format_tb(tb)[-1])
あとは、これをloggingすればよし。
おわり。