zoukankan      html  css  js  c++  java
  • python之追溯函数调用及错误日志详细打印

    一、函数调用追溯

    1.1 原因

            在打印日志时,为实现日志分层打印,将打印日志的语句封装到了print_log_info以及print_log_error中。但是如果在上述函数中直接通过logger.*打印日志,日志中的模块名、行号就会一直打印print_log_info和print_log_error函数中的logger.*中的位置。所以有了追溯函数调用的想法,在打印正常日志时,打印对应模块名以及打印日志语句的行号。

    1.2 使用实例

    2.2.1 追溯函数调用推导

            在一个模块中调用print_log_info函数,在print_log_info函数中调用了trace_caller函数,trace_caller函数定义如下:

    import inspectdef trace_caller(laynum):
        cur_func_name = inspect.currentframe()
        cur_func_name = inspect.getouterframes(cur_func_name, 2)    print(cur_func_name)

    打印结果如下:

    [(<frame object at 0x04DC2B70>, 'C:\Users\Think\PycharmProjects\InterfaceFrame\src\utils\utils.py', 19, 'trace_caller', ['    cur_func_name = inspect.currentframe()
    ', '    cur_func_name = inspect.getouterframes(cur_func_name, 2)
    '], 1), 
    
    (<frame object at 0x04DD5380>, 'C:\Users\Think\PycharmProjects\InterfaceFrame\src\utils\utils.py', 62, 'print_log_info', ['        print(msg) # 在HTMLTestRunner打印测试报告,用例执行成功,不可能触发断言,所以需要打印msg
    ', '        caller_module, msg_lineno = trace_caller(2)
    '], 1), 
    
    (<frame object at 0x04B0C6B0>, 'C:/Users/Think/PycharmProjects/InterfaceFrame/src/InterfaceTest.py', 18, '<module>', ['
    ', '    utils.print_log_info("最后调用tracecall函数")
    '], 1)]

            可以看到打印结果是一个列表,列表中的元素是三个元组,我们重点从每个元素的第2个元素开始关注,发现分别是调用print(cur_func_name)以及上一级调用语句的模块所在路径、代码行数、函数名、以及打印语句。所以我们根据需要取cur_func_name 对应元素的值就可以达到我们想要的效果了。

    1.2.2 代码示例

    def trace_caller(laynum):
        '''    根据传递的laynum追溯函数调用者所在的模块、行数。目前只能在打印日志函数中使用    :param laynum:追溯层数,由于在打印日志函数中调用本函数,追溯层数为2,    :return:模块名, 打印日志所在行号    '''
        cur_func_name = inspect.currentframe()
        cur_func_name = inspect.getouterframes(cur_func_name, 2)
        caller_module = cur_func_name[laynum][1][len(settings.PROJECT_DIR)+1:]
        msg_lineno = cur_func_name[laynum][2]    return caller_module, msg_lineno

    二、错误详细的日志信息打印

            通过上述方式,可以追溯到函数的调用过程,但最多只能追溯到打印日志的logger.info()等语句。如果想要打印出错行的代码,就需要再采用其他方式了。也就是traceback模块

    2.1 traceback模块介绍

            使用traceback模块,可以实现对出错日志的详细输出,但是需要结合try except语句来使用,单独使用会报错。使用案例如下:

    class TestExample(unittest.TestCase):
        def test_add(self):
            result = Test(2, 2).add()        try:            self.assertEqual(result, 3, "加法错误,请重新输入")
                utils.print_log_info("测试成功")        except AssertionError as err:
                err_str = traceback.format_exc()
                utils.print_log_error(err_str)            raise err

    打印日志

    2018-04-25 Wednesday 21:48:47 - ERROR -MainThread:42464 - src	estcase	estExample.py : 16     Traceback (most recent call last):  File "C:UsersThinkPycharmProjectsInterfaceFramesrc	estcase	estExample.py", line 12, in test_add    self.assertEqual(result, 3, "加法错误,请重新输入")  File "C:Python33libunittestcase.py", line 641, in assertEqual
        assertion_func(first, second, msg=msg)  File "C:Python33libunittestcase.py", line 634, in _baseAssertEqual    raise self.failureException(msg)
    AssertionError: 4 != 3 : 加法错误,请重新输入
  • 相关阅读:
    平衡二叉树(AVL Tree)
    算法分析
    稳定匹配
    Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
    java构造函数也可以用private开头
    基于slf4j的log4j实战
    javascript权威指南第6版学习笔记
    hadoop之wordCount程序理解
    java 基本类型和包装类的比较
    设计模式之工厂模式,单例模式,门面模式
  • 原文地址:https://www.cnblogs.com/liulinghua90/p/9054736.html
Copyright © 2011-2022 走看看