#概要
Pythonスクリプトを実行している際に、想定しているエラーのLogを取得する手法を記述します。
Pythonではログの出力に logging.configを使います。
参考
logging.config使ったpythonのロギングについてメモ
http://takemikami.com/2016/06/11/loggingconfigpython.html
#前提
logging.conf ファイルを準備している環境で、 try-exception による exception発生時におけるエラーメッセージに変数を入れ込みたい場合を想定します。
Pythonのドキュメントを参照すると以下のように記載があります。
logging.exception(msg, *args, **kwargs)
レベル ERROR のメッセージをルートロガーで記録します。引数は debug() と同じように解釈されます。例外情報がログメッセージに追加されます。このメソッドは例外ハンドラからのみ呼び出されます。
debug()はどのように解釈されるかは下記のとおりです。
logging.debug(msg, *args, **kwargs)
レベル DEBUG のメッセージをルートロガーで記録します。 msg はメッセージの書式文字列で、 args は msg に文字列書式化演算子を使って取り込むための引数です。 (これは、書式文字列の中でキーワードを使い、引数として単一の辞書を渡すことができる、ということを意味します。)
16.6. logging --- Python 用ロギング機能
https://docs.python.org/ja/3.6/library/logging.html#logging.debug
すなわち、文字列置換を利用して変数を入力することが可能であるということを意味しています。
#コード
1を0で割る簡単なプログラムで想定してみましょう。
1(a)を0(b)で割ろうとし(try)、例外が発生する際には(exception)、ログ上に割る数を変更してくださいという趣旨のログを記載します。
test.py
#logging.configおよび設定ファイルであるlogging.confをインポート
import logging.config
logging.config.fileConfig("logging.conf")
logger = logging.getLogger()
logger.info("info level log")
#0で除算
a = 1
b = 0
try:
c = a/b
except ZeroDivisionError:
print("ゼロで割るとエラーになります")
#logger.exception内のmsgに文字列書式化演算子を入れ込む(%d)
logger.exception("You can not diving by zero. Please change b ---> %d",b, exc_info=True)
print("終わりました")
ログ上はこのように出力されます。
test.log
[2018/12/03 19:05:53][INFO](htmltest.py:4) info level log
[2018/12/03 19:05:53][ERROR](htmltest.py:13) You can not diving by zero. Please change b ---> 0
Traceback (most recent call last):
File "C:/Users/khagiwara/PycharmProjects/untitled1/htmltest.py", line 10, in <module>
c = a/b
ZeroDivisionError: division by zero
"You can not diving by zero. Please change b ---> %d" の %d 部分に変数bを代入することができました。