はてなの金次郎

とあるエンジニアの技術系ブログ

【Python】loggingのerror()とexception()の違い

loggingのerror()とexception()は同じ ERROR レベルのロギング関数なのですが、どういった違いがあるのでしょうか?

結論はPython公式ドキュメントの「Logging HOWTO」に記載されています。

Logger.exception() は Logger.error() と似たログメッセージを作成します。違いは Logger.exception() がスタックトレースを一緒にダンプすることです。例外ハンドラでだけ使うようにしてください。

docs.python.org

実際にコーディングして確かめてみます。

例外処理をまずはerror()でログ出力してみます。 ZeroDivisionError の例外が投げられるようなコーディングをします。

import logging

logger = logging.getLogger('example')
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

try:
    result = 1 / 0
except ZeroDivisionError as e:
    logger.error(f'{e}')

これの出力は以下のようになりました。

2019-01-24 14:27:39,163 - example - ERROR - division by zero

続いて、exception()です。

try:
    result = 1 / 0
except ZeroDivisionError as e:
    logger.exception(f'{e}')

この出力は以下のようになりました。

2019-01-24 14:27:39,175 - example - ERROR - division by zero
Traceback (most recent call last):
  File "<ipython-input-2-6a7fc51b65bc>", line 2, in <module>
    result = 1 / 0
ZeroDivisionError: division by zero

上記のように、exception() のログにはスタックトレースが出力されているのに対し、error() のログには確認できません。

実際に試してみると非常にシンプルな違いですね。

例外処理のとき、exception() でログを出力するとスタックトレースとともに詳細なログが出力されます。 よって、例外処理のときは exception() を、それ以外のときは error() を使うと良いということでした。

上記のスクリプトGitHubでも公開していますので、よろしければご確認ください。

github.com

f:id:gyuuuutan:20190124145333p:plain
error()の場合

f:id:gyuuuutan:20190124145402p:plain
exception()の場合