私が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)
設定したいレベルにより引数内を変更してください。
ログを出力しすぎると処理が重くなって動作が遅くなってしまう可能性があります!
ログを入れる場合は内容によりレベルを考慮して挿入し、実際のシステム導入する場合は、ログレベルを高く設定しておくことをオススメします。
コメント