一、函数调用追溯

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之追溯函数调用及错误日志详细打印的更多相关文章

  1. 【python小随笔】Django+错误日志(配置Django报错文件指定位置)

    1:  自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 # 定义一个日志文件 创建一个操作日志对象logger file_1 = logging.FileHandle ...

  2. Nginx 改变错误日志打印级别

    Nginx 改变错误日志打印级别 user  root;worker_processes  2; worker_rlimit_nofile 10240;error_log logs/nginx_err ...

  3. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

  4. 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,

    第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...

  5. SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志

    在打开数据库的时候,突然出现异常错误,然后我去关闭sql server 服务,然后重启服务的时候,不能重启,出现以下错误 “请求失败或服务未及时响应.有关详细信息,请参见事件日志或其它适合的错误日志” ...

  6. SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。

    转自:https://www.fengjunzi.com/blog-25573.html 问题 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务 ...

  7. 解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息。

    解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留.可能修改数据集的命令被禁用.请检查Redis日志,了解有关错误的详细信息. 出现bug: 在学习celery,将数据 ...

  8. python清除数据库错误日志

    # coding=gbk from encodings import gbk  import re   import sys import  os import  pyodbc import trac ...

  9. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

随机推荐

  1. QtCreator源码分析—2.启动主程序(4篇)

    QtCreator采用插件体系结构.主程序启动插件管理器(PluginManager),再通过插件管理器加载其插件,QtCreator的所有功能均使用插件实现. 我们先来分析主程序对插件管理器的主要操 ...

  2. Rotate Array II

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  3. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  4. A Mist of Florescence CodeForces - 989C(思维构造)

    题意: 让你构造一个图,使得A,B,C,D的个数为给定的个数,上下左右连通的算一个. 哎呀 看看代码就懂了..emm..很好懂的 #include <bits/stdc++.h> usin ...

  5. STL 算法介绍

    STL 算法介绍 算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成.        <algorithm ...

  6. hbase 分页过滤(新老API的差别)

    在hbase2.0以前分页过滤必须以上一次的最后一行+空字节数组作为下一次的起始行, 因为scan扫描的时候是包含起始行的,为了既能准确定位起始行,但又不重复把上一次的最末一行加入下一页, 所以,权威 ...

  7. [洛谷P4091][HEOI2016/TJOI2016]求和

    题目大意:给你$n(n\leqslant10^5)$,求:$$\sum\limits_{i=0}^n\sum\limits_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix ...

  8. 【NOI 2018】冒泡排序(组合数学)

    题意大概是给定一个长度为$n$的排列$p$,求有多少长度为$n$的排列满足冒泡排序的交换次数为$\frac{1}{2} \sum\limits_{i = 1}^{n}|i - p_{i}|$. 可以发 ...

  9. Qt 文档编辑设置

    该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!   导语        前面已经在主窗口中添加了菜单和工具栏,这一篇中我们将实现基本的文本编辑功能 ...

  10. golang interface 类型变量当作某个具体类型使用

    比如,我们定义了一个 struct type person struct { Name string `json:"name"` Age int `json:"age&q ...