Python培训
美国上市Python培训机构

400-111-8989

热门课程

如何用python编程追溯函数调用及错误日志的详细打印?

  • 发布:还是圆滚滚童鞋
  • 来源:柠檬班软件测试
  • 时间:2018-05-18 17:08

如何用python编程追溯函数调用及错误日志的详细打印?

昨天小编看了一款儿童编程机器人,可以自己写编程控制机器人,突然觉得会编程真的会让生活中的乐趣增加很多。还有,也会让你的工作方便很多,例如,很多SEOer人员都会定期查看分析一下网站日志,但是这个数据很多又显得很凌乱,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()\n', ' cur_func_name = inspect.getouterframes(cur_func_name, 2)\n'], 1),

(<frame object at 0x04DD5380>, 'C:\\Users\\Think\\PycharmProjects\\InterfaceFrame\\src\\utils\\utils.py', 62, 'print_log_info', [' print(msg) # 在HTMLTestRunner打印测试报告,用例执行成功,不可能触发断言,所以需要打印msg\n', ' caller_module, msg_lineno = trace_caller(2)\n'], 1),

(<frame object at 0x04B0C6B0>, 'C:/Users/Think/PycharmProjects/InterfaceFrame/src/InterfaceTest.py', 18, '<module>', ['\n', ' utils.print_log_info("最后调用tracecall函数")\n'], 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\test\case\testExample.py : 16 Traceback (most recent call last): File "C:\Users\Think\PycharmProjects\InterfaceFrame\src\test\case\testExample.py", line 12, in test_add self.assertEqual(result, 3, "加法错误,请重新输入") File "C:\Python33\lib\unittest\case.py", line 641, in assertEqual

assertion_func(first, second, msg=msg) File "C:\Python33\lib\unittest\case.py", line 634, in _baseAssertEqual raise self.failureException(msg)

AssertionError: 4 != 3 : 加法错误,请重新输入

恭喜你阅读完了本文,知道了如何用python编程追溯函数调用及错误日志的详细打印,现在你就可以在你的网站里边试一下,看看这可喜的效果,如果你还有更多python相关的问题,欢迎你来达内python培训机构进行咨询。

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

怕钱不够?可就业挣钱后再付学费!    怕学不会?助教全程陪读,随时解惑!     担心就业?一地学习,可全国推荐就业!

上一篇:如何利用python将PDF转化为图片?
下一篇:如何用python更改windows开机密码?

Python热点问题全解答|Python是一种什么语言?用Python可以做什么?

邀你来讨论:为什么大四生自学Python两个月找不到工作?

如何利用业余时间自学Python数据分析,怎样才能快速上手?

编程初学者应该选择Python吗?Python学习过程中有哪些小技巧呢?

选择城市和中心
贵州省

广西省

海南省