techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

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") 等)を呼び出すとログ出力をすることができる。 しかし、実装が煩雑になるため関連処理をクラスにまとめておくと使用しやすくなる。下記ページで公開されているコードが参考になった。

resanaplaza.com

上記ページの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!!

参考記事

qiita.com