loggingを用いた動作ログ出力
概要
pythonのライブラリloggingを用いた動作ログの出力方法についてまとめる
logger
loggingはpython標準のログ出力用ライブラリであり、ソフトの動作(デバッグ用情報、エラー、例外など)の発生時刻やレベルを管理してログファイルに出力することができる。
loggerモジュールは下記の手順で使用する。
1. loggerの設定
loggerはログの生成・受け渡し等を管理するオブジェクトである。ログを出力ために、ソフトの最初でloggerを生成する。loggerはエラーの種類によって出力する対象を下記の5つのレベルで分類できる。
エラーレベル | 値 | 使用例 |
---|---|---|
DEBUG | 10 | 開発時のみ使用するメッセージ |
INFO | 20 | 想定内の動作の確認用メッセージ(ソフトの起動/終了など) |
WARNING | 30 | 動作に影響のないエラー(正常値範囲外となる信号など) |
ERROR | 40 | 機能に影響のあるエラー(動作条件を満たせない信号異常) |
CRITICAL | 50 | プログラムの動作に影響のある致命的なエラー |
loggerが出力するレベルの閾値をlogger.setLevel関数で制限できる。setLevelで設定した値以下のエラーレベルの警告が無視されるようになる。開発時と正式運用で出力するログのレベルを調整したい場合に活用できる。
filename = "test" logger = logging.getLogger(filename) logger.setLevel(10) #DEBUG情報は表示しない
2. handlerの設定
handlerはloggerから受け取ったエラー情報の出力をするオブジェクトである。handlerに対して、エラー時に出力するメッセージのフォーマット設定をすることができる。
一例として、ログファイルにエラーの発生時刻・エラーレベル・logger呼び出し時に引数にセットした文字列を出力したい場合には次のように設定できる。
#フォーマッタの設定 fmt = logging.Formatter('[%(asctime)s] (%(levelname)s) %(message)s') #ファイルハンドラの作成 fh = logging.FileHandler(filename, encoding='utf-8') #ファイルハンドラにフォーマッタを設定 fh.setFormatter(fmt) #ファイルハンドラをロガーに設定 self.logger.addHandler(fh)
クラスを使った簡易化
上記設定後に各モジュールがloggerを読み込んで出力用の関数(logger.debug("TEST") 等)を呼び出すとログ出力をすることができる。 しかし、実装が煩雑になるため関連処理をクラスにまとめておくと使用しやすくなる。下記ページで公開されているコードが参考になった。
上記ページのLogManクラスをlogMan.pyとして保存しておいたときに、ログ出力を呼び出すときのコードを下記に示す。 注意点として、exceptionを呼び出す際にはエラー内容は自動的に表示されるため文字列には何も設定する必要はない
import os from logMan import LogMan if __name__ == '__main__': lm = LogMan(os.path.abspath('.')+"/log/log.txt",stdout=True) lm.info("Program started!!") #error A lm.error("Error A!!") #warning B lm.error("WARNING B!!") #exception try: x = 1/0 except: lm.exception("EXCEPTION X") lm.info("Program Finished!!")
生成されるログファイル
[2023-02-26 16:44:08,760] logMan.py (INFO) Program started!! [2023-02-26 16:44:08,761] logMan.py (ERROR) Error A!! [2023-02-26 16:44:08,761] logMan.py (ERROR) WARNING B!! [2023-02-26 16:44:08,762] logMan.py (ERROR) EXCEPTION X Traceback (most recent call last): File "d:\WS\VS_project\BlogProject\BlogProject\loggintTest.py", line 18, in <module> x = 1/0 ZeroDivisionError: division by zero [2023-02-26 16:44:08,763] logMan.py (INFO) Program Finished!!