複雑なプログラムを組んでいると、メソッドの開始・終了時刻やどういう順番でどのメソッドが実行されたかの情報を後から確認したいことがありませんか?
logging を使ってログ出力を、inspect を使ってメソッド名の取得が可能ではありますが、簡単に取得したいですよね。
本記事では、デコレートするだけで簡単に実行したメソッドに関する情報(処理時刻、モジュール名、ファイル名、、メソッド名、行番号)をログ出力する方法を紹介します。
目次
サンプルコード
下記の declogger を対象のメソッドにデコレートするだけでログ出力できます。
import logging.config
import datetime
import time
import inspect
def getlogger():
return logging.getLogger(__name__)
def setfileConfig(_path):
logging.config.fileConfig(fname=_path)
def declogger(func):
curframe = inspect.currentframe()
calframe = inspect.getouterframes(curframe, 2)
fn = calframe[1][1].split("/")
filename = fn[len(fn) - 1]
modulename = fn[len(fn) - 2]
lineno = calframe[1][2]
code_context = calframe[1][4]
funcname = code_context[len(code_context) - 1]
defaultmessage = "[" + modulename + "." + filename + ":" + str(lineno) + "][" + funcname.strip() + "]:"
def wrapper(*args, **kwargs):
sw = StopWatch()
sw.sw_start()
_logger = getlogger()
_logger.debug(defaultmessage + "start:-----")
kekka = func(*args, **kwargs)
syorijikan = f"***** 処理時間:{sw.sw_stop()} ***"
_logger.debug(defaultmessage + "-end-:" + syorijikan)
return kekka
wrapper.__name__ = func.__name__
return wrapper
def edtmessage(message):
calframe = inspect.getouterframes(inspect.currentframe(), 2)
fn = calframe[2][1].split("/")
filename = fn[len(fn) - 1]
modulename = fn[len(fn) - 2]
lineno = calframe[1][2]
return "[" + modulename + "." + filename + ":" + str(lineno) + "][" + calframe[1][3] + "]:" + str(message)
def writedebuglog(message):
getlogger().debug(edtmessage(message))
return
def writeinfolog(message):
getlogger().info(edtmessage(message))
return
def writeerrorlog(message):
getlogger().error(edtmessage(message))
return
class StopWatch:
def sw_start(self):
self.__starttime = time.time()
return
def sw_stop(self):
return time.time() - self.__starttime
使用イメージ
下記のようにメソッド名の1行上段に「@declogger」を入力することで使用できます。
@declogger
def test():
i = 0
for j in range(0,10):
writedebuglog(f"{j}回目の処理を開始します")
writeinfolog(f"{j}回目の処理を開始します")
writeerrorlog(f"{j}回目の処理を開始します")
i = i + j
出力イメージ
使用結果は下記のようになります。
Google Colaboratory で実行する
下記リンクよりGoogle Colaboratory から直接実行できます。
Google Colaboratory でログを出力する方法を参考にログファイルをご確認ください。
まとめ
本記事では、デコレートするだけで簡単に実行したメソッドに関する情報(処理時刻、モジュール名、ファイル名、メソッド名、行番号)をログ出力する方法を紹介しました。
ご参考になりましたら twitter をフォローして SNS でシェアして頂ければ幸いです。
IT・プログラミングに関する相談・依頼はこちら