【Python】デコレートするだけで簡単にログ出力する方法【logging・inspect】【サンプルあり】

3 min

複雑なプログラムを組んでいると、メソッドの開始・終了時刻やどういう順番でどのメソッドが実行されたかの情報を後から確認したいことがありませんか?

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

Google Colaboratory でのログ出力方法については下記をご参考ください

実行中のオブジェクト情報の取得方法については下記をご参考ください

デコレーターの基本的な使い方については下記をご参考ください。

使用イメージ

下記のようにメソッド名の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 から直接実行できます。

Open In Colab

Google Colaboratory でログを出力する方法を参考にログファイルをご確認ください。

まとめ

本記事では、デコレートするだけで簡単に実行したメソッドに関する情報(処理時刻、モジュール名、ファイル名、メソッド名、行番号)をログ出力する方法を紹介しました。

ご参考になりましたら twitter をフォローして SNS でシェアして頂ければ幸いです。

IT・プログラミングに関する相談・依頼はこちら
広告_零号機-エリア2
kewton

kewton

大学院卒業後、某大手SIerで10年以上SEとして従事。
社会人3年目までに基本情報・応用情報技術者、データベーススペシャリスト、簿記3級・2級を取得。
基幹系システム・IoTシステム開発のプロジェクト経験多数。AI活用システムの企画・プロト開発経験あり。
強みは、プロマネだけでなく自身で開発も実施してきたこと。
【扱える言語】
C#、java、python、javascript、Excel VBA
【扱えるDB】
oracle、sql server、postgreSQL、mongoDB

FOLLOW

関連記事

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA