Python C言語っぽいデバッグログサンプル

私がC言語を扱っていた時に、現場などでよく使用していたログ出力のフォーマットです。

import sys
from datetime import datetime

def func():
  print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"), __file__ + "(" + str(sys._getframe().f_lineno) + ")", sys._getframe().f_code.co_name, ":")
  # 2020/09/30 00:51:43 debug_log.py(55) func :

出力内容は実行時の「時間(年月日時分秒)」「ファイル名」「行数」「関数名」の情報です。

他のファイルから呼び出す用にデバッグ出力用のクラスを作成しました。

import sys
import inspect
from datetime import datetime
from enum import IntEnum, auto

class DebugLog:
    class Level(IntEnum):
        ERROR = 0
        WARN = auto()
        INFO = auto()
        DEBUG = auto()
        TRACE = auto()
    
    __lev = int(Level.INFO)

    @classmethod
    def set_level(cls, level):
        __lev = level

    @classmethod
    def error(cls, detail=""):
        if cls.__lev >= cls.Level.ERROR:
            cls.log_print(cls.Level.ERROR.name, detail)

    @classmethod
    def warn(cls, detail=""):
        if cls.__lev >= cls.Level.WARN:
            cls.log_print(cls.Level.WARN.name, detail)

    @classmethod
    def info(cls, detail=""):
        if cls.__lev >= cls.Level.INFO:
            cls.log_print(cls.Level.INFO.name, detail)

    @classmethod
    def debug(cls, detail=""):
        if cls.__lev >= cls.Level.DEBUG:
            cls.log_print(cls.Level.DEBUG.name, detail)

    @classmethod
    def trace(cls, detail=""):
        if cls.__lev >= cls.Level.TRACE:
            cls.log_print(cls.Level.TRACE.name, detail)

    @classmethod
    def log_print(cls, name, detail):
        st = inspect.stack()[2]
        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"),
                st.filename + "(" + str(st.lineno) + ")",
                "[" + name + "]",
                st.function,
                ":",
                detail)

使用例:下記はtest.pyに記載しています。

def func():
    DebugLog.error("エラー内容")
    DebugLog.warn("警告内容")
    DebugLog.info("情報")
    DebugLog.debug("デバッグ内容")
    DebugLog.trace("トレース")
# 2020/09/30 01:05:27 test.py(4) [ERROR] func : エラー内容
# 2020/09/30 01:05:27 test.py(5) [WARN] func : 警告内容
# 2020/09/30 01:05:27 test.py(6) [INFO] func : 情報

ログレベルは次のようになっており、現在のレベルより低い場合は表示されません。

レベル項目
ERROR
WARN
INFO
DEBUG
TRACE

上記例では、ログレベルが初期状態の「INFO」となっており、これより低いレベルのログは表示されません。

ログレベルの設定方法は次の通りです。

DebugLog.set_level(DebugLog.Level.ERROR)

設定したいレベルにより引数内を変更してください。

ログを出力しすぎると処理が重くなって動作が遅くなってしまう可能性があります!
ログを入れる場合は内容によりレベルを考慮して挿入し、実際のシステム導入する場合は、ログレベルを高く設定しておくことをオススメします。

コメント