python避坑指南02——logging模块日志重复打印问题

目录

[TOC]

一、问题抛出

python的logging模块是python使用过程中打印日志的利器。我们可以使用logging模块的logger、Handler、formatter对我们的日志进行封装,指定日志输出的路径、格式以及位置。在声明logger的时候可以传一个字符串作为这个logger的标签。一直以为这个logger是以单例对象的设计模式设计的,只要这个标签名是一样的,那么返回的logger就是同一个。在打印日志的时候,想要实现日志分层,定义类如下函数来封装日志打印函数(由于源代码已经修改,用伪代码形式)

def print_log_info(msg):
    # Logger是我定义的一个类,用来封装日志打印的
    logger = Logger(‘INFO‘).getLogger()
    logger.info(msg)

在测试用例中用到了ddt,将测试用例参数化。关键代码如下:

    @data(*test_datas[‘test_add‘])
    @unpack
    def test_add(self, *args, **kwargs):
        data_path, err_num, test_id, p1, p2, value = args
        result = Test(p1, p2).add()
        try:
            self.assertEqual(result, value, "在{err_num}行用例编号为{test_id}的测试中加法错误,请重新输入" .format(
                err_num = err_num,
                test_id = test_id
            ))
            utils.print_log_info("在{err_num}行用例编号为{test_id}的测试中加法测试成功".format(err_num = err_num,test_id = test_id))
        except AssertionError as err:
            err_str = traceback.format_exc()
            raise err

执行完测试用例后,发现一条测试用例打印了多条,并且,重复打印次数由1一直增加到n(博主比较懒,这是源代码出现的问题截图)。

二、问题解决

一开始,一直以为是ddt的bug。但后来直接在外部定义了一个logger,调用这个logger打印日志的时候,发现日志没有重复打印的情况,而当我偶然的情况下,两次声明了同一个logger的情况下,发现日志打印了两次。便开始思考这是不是logging模块本身的问题,由于第一章的代码中,每次打印日志,都需要print_log_info()函数,这个函数每次调用时,都申明了一次logger。每一条测试用例执行完,都需要打印日志,再声明一次logger,那么声明logger的次数就是1累计增加到n,是不是和我们上面重复日志打印的情况类似?所以考虑问题的出现是由重复声明logger造成的。为了验证猜想,对代码做如下修改(源代码太长,粘部分关键代码)。

info_logger = Logger(‘INFO‘).get_logger()
error_logger = Logger(‘ERROR‘).get_logger()

def print_log_info(msg):
    ‘‘‘
    打印测试用例执行的正常信息以及控制台日志
    :param msg:需要打印的信息
    :return:
    ‘‘‘
    # 获取函数调用者的信息
    caller_module, msg_lineno = trace_caller(2)
    edit_msg = ‘[%s] : [%s]     %s‘ % (caller_module, msg_lineno, msg)
    print(edit_msg)
    info_logger.info(edit_msg)

def print_log_error(msg):
    ‘‘‘
    用例出错时,打印错误日志以及控制台输出
    :param msg: 需要打印的信息
    :return:
    ‘‘‘
    edit_msg = msg
    error_logger.error(edit_msg)

测试用例中,与第一章同样的方式调用日志打印的代码,得到日志如下,重复日志的bug已经解决:

[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [82]     在3行用例编号为test_add01的测试中加法测试成功
[2018-04-30 Monday 12:00:45] [ERROR] [MainThread:28980]
文件:data\calculator.xls中测试用例出错
出错用例行:4,用例编号:test_add02
Traceback (most recent call last):
  File "C:\Users\Think\PycharmProjects\InterfaceFrame\src\test\case\testExample.py", line 80, in test_add
    test_id = test_id
  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: 3 != 4 : 在4行用例编号为test_add02的测试中加法错误,请重新输入

[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [82]     在5行用例编号为test_add03的测试中加法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [82]     在6行用例编号为test_add04的测试中加法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [160]     在15行用例编号为test_div01的测试中除法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [160]     在16行用例编号为test_div02的测试中除法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [160]     在17行用例编号为test_div03的测试中除法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [160]     在18行用例编号为test_div04的测试中除法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [135]     在11行用例编号为test_multi01的测试中乘法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [135]     在12行用例编号为test_multi02的测试中乘法测试成功
[2018-04-30 Monday 12:00:45] [INFO] [MainThread:28980] [src\test\case\testExample.py] : [135]     在13行用例编号为test_multi03的测试中乘法测试成功

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

时间: 2024-11-02 04:08:11

python避坑指南02——logging模块日志重复打印问题的相关文章

安装Seafile Server 7.1.3 不完全避坑指南

容易踩的坑 解决依赖关系是安装seafile server的第一个坑. 官方提供的安装包,大部分依赖都已经打包在包里了, 只有seahub依赖的部分Python包,因为使用了C语言,编译安装时必须和Python的版本对应(这也是之前Windows版本必须安装指定版本python的原因),由于无法预知客户端的Python版本,所以无法包含在安装包中. MySQL/Mariadb数据库配置是第二个坑. 有些系统安装的MySQL/Mariadb数据库,默认配置是不允许root用户通过网络连接服务器的,

自如租房避坑指南

[自如租房避坑指南] 在北京工作了两年半的时间里,由于工作原因换了3次房,租的都是 自如的房子,选择自如的原因是因为自如省事,该有的东西都有.但是也有些比较坑的地方,这里列举一下,租房的时候需要注意,这样能让你租到一个比较顺心的房子. 不要完全相信自如APP上面标的房屋面积 在我租房的过程中我看过一些自如的房子,发现自如有些房屋的面积是虚标的,有些标示8平米的房子实际可能只有6平米,有时间最好还是实地去看一下,感觉面积合适再租 价格特别便宜的要注意(相对该房子周边来说) 有时候你在自如上看到特别

Python logging模块日志存储位置踩坑

问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个文件中都有使用Python自带的logging模块,来记录日志.其中前者将日志存入到db_xxx.log下,后者存入run_xxx.log下. 两者logging相关代码为: # db.py import logging import time dt = time.time() logging.ba

pythopn logging 模块(日志)

一 (简单应用) import logging logging.debug('debug message') #不会输出任何东西 默认设置级别不够 logging.info('info message') #不会输出任何东西 默认设置级别不够 logging.warning('warning message') #WARNING:root:warning message logging.error('error message') #ERROR:root:error message loggin

python学习第五十二天logging模块的使用

很多程序都有记录日志的需求,并且日志包含的信息即有正常的程序访问日志,还可能有错误,警告等信息输出,python的 logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分debug(),info() warning() error() and critical()个级别,下面我们看一下怎么用 import logging logging.warning("www.96net.com.cn") logging,critical("ww

【Pytyon模块】logging模块-日志处理

一.日志相关概念 1.日志的作用 通过log的分析,可以方便用户了解系统或软件.应用的运行情况:如果你的应用log足够丰富,也可以分析以往用户的操作行为.类型喜好.地域分布或其他更多信息:如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位.解决问题,补救损失.简单来讲就是,我们通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常,也可以在应用程序出现故障时快速定位问题.比如,做运维的同学,在接收到报警或各种问题反馈后,进行问题排查时通

Python数据库 6.datetime与logging模块

6.1 datetime模块 datetime是python处理时间和日期的标准库 类名         功能说明?date 日期对象,常用的属性有year, month, day?time 时间对象hour,minute,second,毫秒?datetime 日期时间对象,常用的属性有hour, minute, second, microsecond?timedelta 时间间隔,即两个时间点之间的长度 主要使用: datetime.datetiem( ) . datetime.timedel

跳槽找工作避坑指南(2019版)

虽说年前就有很多人在修改简历.刷新简历,但是为了大家心中所谓的年终奖,99.9999%的人都会选择沉默,有一种「明修栈道,暗度陈仓」意味. 拿完了年终奖,过完了春节,老子早TMD的不想干了,终于不用在你「对象是种扣嗖的老板或领导」这里受你这等鸟气了.于是乎,吭哧吭哧的埋头苦写简历,狂撒网,做梦都想有朝一日能出任CEO,迎娶白富美,走上人生的巅峰. 理想是丰满的,现实是残酷的,搞不好,美梦没有做完,就会吃上一记当头一棒,将你打入「绝情谷」谷底.所以,跳槽找工作一定要慎重,慎重,再慎重. 之前也写过

使用log4j.xml日志重复打印解决方案

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <!-- in java cmd add -Dlog4j.configuration=logging.xml --> <log4j:configuration xmlns:log4j="http://jakarta.a