python之追溯函数调用及日志详细打印

目录

[TOC]

一、函数调用追溯

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 inspect

def 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 : 加法错误,请重新输入

原文地址:https://www.cnblogs.com/gupan/p/8947857.html

时间: 2024-10-10 11:21:18

python之追溯函数调用及日志详细打印的相关文章

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

Python 全栈开发八 日志模块

日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变量数据的消息来描述.此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level). 1.日志的作用 通过log的分析,可以方便用户了解系统或软件.应用的运行情况:如果你的应用log足够丰富,也可以分析以往用户的操作行为.类型喜好.地域分布或其他更多信息:如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状

__str__被print函数调用,目的是打印类的内容到屏幕上

# -*- coding: utf-8 -*- #python 27 #xiaodeng #__str__被print函数调用,目的是打印类的内容到屏幕上 class APIError(): def __init__(self, error_code, request): self.error_code = error_code self.request = request def __str__(self): #一般都是return return 'APIError: %s, \nreques

Log4j 日志详细用法

简单的说log4j就是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优先级.日志信息的输出目的地.日志信息的输出格式 Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息. 程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试.这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只

python web开发-flask中日志的使用

Flask使用日志记录的方式: 1. 初始化flask应用实例 在flask中使用logger,需要初始化一个flask的应用 app = Flask(__name__) 2. 调用logger 直接调用logger方法 app.logger.info("my first logging") 这里记录的是info级别的日志 3. 查看结果 运行结果如下: INFO in Code [D:/xxxxx/flask/Code.py:20]: my first logging 默认情况下,f

python 提交SVN 写更新日志

SCENE = "mjdy_dyhry" DIRS = { "md5/scenes/" + SCENE, "data/tex/scenes/" + SCENE, "data/tex/share", "data/mesh/scenes/" + SCENE, } import os WORKSPACE = "D:/workspace/muData/"#os.getcwd()+ # execu

Tomcat访问日志详细配置

在server.xml里的<host>标签下加上 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/

python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客

python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客 python海明距离 2009-10-01 09:50:41|  分类: Python |  标签: |举报 |字号大中小 订阅 def hammingDist(s1, s2):    assert len(s1) == len(s2)    return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客,布布扣,

python(38):日志logging模块学习

1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印: WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING:日志级别大小关系为:CRITICAL > ER