python log 打印函数名和调用关系

python log打印

关于log打印,如果需要自定义输出到文件,当然是logging库
但是logging不能打印出每个调用函数的调用关系,在看log去找问题的时候有时候会很头疼
这样需要打印每一步的执行流程可以参考使用inspect模块

小例子

写个测试代码,可以打印调用关系,先记录在这里:
myLog.py文件如下:

from inspect import getargvalues, stack
from re import findall
from time import strftime, localtime
import logging

ERROR = "Error"
WARNING = "Warning"
INFO = "Info"
DEBUG = "Debug"
NOTSET = 0

def get_class_from_frame(fr):
    args, _, _, value_dict = getargvalues(fr)
    if len(args) and args[0] == 'self':
        instance = value_dict.get('self', None)
        if instance:
            return getattr(instance, '__class__', None)
    return None


class MyLog(object):
    def __init__(self, log_file_path='test'):
        self.filename = log_file_path + ".log"
        logging.basicConfig(filename=self.filename, level=logging.DEBUG, filemode='a+', format='%(asctime)s [%(chain)s] %(message)s')

    def get_meta_data(self):
        frames = stack()
        chain_list = []
        for i in range(0, len(frames)):
            _, file_path, _, func_name, _, _ = frames[i]
            file_name = file_path.split('/')[-1]
            try:
                args = findall('\((.*)\)', frames[i+1][-2][0])[0]
            except IndexError as e:
                func_name = get_class_from_frame(frames[0][0]).__name__
                args = ''
            current_chain = '%s:%s(%s)' % (file_name, func_name, args)
            chain_list.append(current_chain)
        return list(reversed(chain_list))

    def write(self,  message=" ", level=NOTSET):
        if level == NOTSET:  #  默认显示所有调用目录
            info= ' --> '.join(self.get_meta_data()[:-2])
        else:
            info= level
        logging.info(message, extra={'info': info})

test.py

import myLog as Log
log = Log.MyLog("text")
class Test1:
    def test1(self):
        log.write( f"Read file fail", Log.ERROR)   # 不显示执行过程,显示错误等级
    def test2(self):
        log.write(f"Show some thing ... ")   # 显示执行过程

t = Test1()
t.test1()
t.test2()
	

生成log如下:

2020-04-23 16:29:07,200 [Error] Read file fail
2020-04-23 16:29:07,234 [test.py:MyLog() --> test.py:test2()] Show some thing ... 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值