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小随笔】Django+错误日志(配置Django报错文件指定位置)
1: 自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 # 定义一个日志文件 创建一个操作日志对象logger file_1 = logging.FileHandle ...
- Nginx 改变错误日志打印级别
Nginx 改变错误日志打印级别 user root;worker_processes 2; worker_rlimit_nofile 10240;error_log logs/nginx_err ...
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,
第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...
- SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
在打开数据库的时候,突然出现异常错误,然后我去关闭sql server 服务,然后重启服务的时候,不能重启,出现以下错误 “请求失败或服务未及时响应.有关详细信息,请参见事件日志或其它适合的错误日志” ...
- SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。
转自:https://www.fengjunzi.com/blog-25573.html 问题 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务 ...
- 解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息。
解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留.可能修改数据集的命令被禁用.请检查Redis日志,了解有关错误的详细信息. 出现bug: 在学习celery,将数据 ...
- python清除数据库错误日志
# coding=gbk from encodings import gbk import re import sys import os import pyodbc import trac ...
- 转载:python + requests实现的接口自动化框架详细教程
转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...
随机推荐
- [转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.
USB-C和Thunderbolt 3连接线你搞懂了吗? 2018年11月25日 07:30 6318 次阅读 稿源:威锋网 3 条评论 按照计算行业的风潮,USB Type-C 将会是下一代主流的接 ...
- Linux里的稀疏文件
今天发现一个有意思的现象,文件系统大小只有37GB,上面却有一个900GB的文件!查了下,这个叫“稀疏文件”,我理解类似于VMWare里的瘦硬盘模式吧,先预先划出一块空间,然后往里填数据. [root ...
- 微信小程序 功能函数 支付接口
// 订单生成返回数据,弹出是否支付模态 wx.showModal({ title: '微信支付', content: '确定支付吗?', success: function (res) { if ( ...
- 一条慢SQL引发的血案
直接切入正题吧: 通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了先看看这个SQL张撒样子: # Query_time: 70 ...
- 简明Python教程自学笔记——命令行通讯录
[前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...
- Joseph's Problem UVALive - 3521(等差数列的应用)
题意:给定n, k,求出∑ni=1(k mod i) 思路:由于n和k都很大,直接暴力是行不通的,然后在纸上画了一些情况,就发现其实对于k/i相同的那些项是形成等差数列的,于是就可以把整个序列进行拆分 ...
- 【刷题】BZOJ 2816 [ZJOI2012]网络
Description http://www.lydsy.com/JudgeOnline/upload/zjoi2012.pdf Solution 维护树上联通块的信息,支持动态加边删边 LCT 总共 ...
- Android Support WorkManager使用详解
使用WorkManager调度任务 WorkManager是一个库, 用以将工作入队, 当该工作的约束条件得到满足之后, WorkManager保证它的执行. WorkManager允许观测工作的状态 ...
- 中行P1签名及验签
分享中国银行快捷.NET P1签名和验签方法代码中ReturnValue为自定义类型请无视 #region 验证签名 /// <summary> /// 验证签名 /// </sum ...
- ActiveMQ反序列化漏洞(CVE-2015-5254)复现
0x00 漏洞前言 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等.Apache ...