最近再写DOU用例时,采用的是 unittest测试框架,就涉及到将其它所有模块需要全部在一个 .py文件中进行实例化,然后再运行时发现在控制台中同一个日志信息会打印多次(实例化几次,同一消息就会打印几次),现象如下:

在文件 Run_DOU.py 文件中进行了9次实例,如下:

再运行 Run_DOU.py 时,发现日志打印如下(重复打印日志的次数跟上面实例化的个数相同):

在common.py 中找到 log 的输出方法,代码如下:

我们每次在实例化 get_log() 方法时,都会添加一次 handlers,log.handlers 实例上是一个列表,这就会导致我们多次进行实例化,这个log.handlers就会把每次的 handler 添加进来。

Google之后,大概搞明白了,就是你第二次调用log的时候,根据getLogger(logname)里的logname获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,所以,这个logger里有了两个同样的handler,以此类推,调用几次就会有几个handler。。

所以这里有以下几个解决办法:

1、每次创建不同name的logger,每次都是新logger,不会有添加多个handler的问题。(ps:这个办法太笨,不过我之前就是这么干的。。)

2、像上面一样每次记录完日志之后,调用removeHandler()把这个logger里的handler移除掉。

3、在log方法里做判断,如果这个logger已有handler,则不再添加handler。

4、与方法2一样,不过把用pop把logger的handler列表中的handler移除。

下面按照第3种方法进行修改 get_log()方法,如下:

再次运行 Run_DOU.py 看看输出结果是否符合预期(这次日志就没有再重复打印了,看着也爽了):

附上源码:

[BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法的更多相关文章

  1. SpringBoot 内部方法调用,事务不起作用的原因及解决办法

    在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...

  2. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法

    一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...

  3. discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法

    discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...

  4. 调用list(itertools.combinations(keys,3))出现MemoryError的解决办法

    在python3.6中,如下例子: keys = list(newKeywords.keys()) resultkeys = list(itertools.combinations(keys,3)) ...

  5. 检索 COM 类工厂中 CLSID 为 {{10020200-E260-11CF-AE68-00AA004A34D5}} 的组件时失败解决办法

    检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下: 第一步:首先将msvcr71.dll,  SQLDM ...

  6. python写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法

    在写入TXT文件时,某些页面总是报UnicodeEncodeError: ‘gbk’ codec can’t encode character错误,网上找了半天也没找到解决办法. 后来终于找到了解决办 ...

  7. python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法

    原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...

  8. Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法

    相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...

  9. 调用discuz编辑器发布帖子显示html代码的解决办法

    <!--{echo htmlspecialchars_decode(discuzcode($post[message], , , , , , , , , , ));}--> 在discuz ...

随机推荐

  1. 我进行jvm内存调优的一些记录

    jvm内存调优的一些记录 java内存调优的方法和过程 可以使用 jmap -heap pid号 查看,例如pid是9300,执行的结果可能是这样的. root@ubuntu:~# jmap -hea ...

  2. [转]web打印实现方案 Lodop6.034 使用方法总结

    本文转自:https://www.cnblogs.com/tiger8000/archive/2011/09/19/2181365.html 官文下载: http://mtsoftware.v053. ...

  3. 念念不忘,ASP.NET MVC显示WebForm网页或UserControl控件

    学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user control呢?这个灵感(算不上灵感,只能算是想法)是来自前些天有写过一 ...

  4. Redis-其他命令

    1.排序 SORT :  SORT  sourcekey [BY pattern] [LIMIT offset count] [GET  pattern [GET  pattern  ...]] [A ...

  5. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  6. Donsen法则

    “专才”对越来越少的事物了解得越来越多,直到最后他对不存在的事物无所不知: 然而,“通才”对越来越多的事物了解得越来越少,直到他对一切事物一无所知.

  7. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  8. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  9. 如何解决Your project contains C++ files but it is not using a supported native build system

    最近因为项目需要下载Android终端模拟器(Android-Terminal-Emulator)源码进行调试编译,编译过程中出现报错 Error:Execution failed for task ...

  10. 获取windows鼠标的当前坐标

    #先下载pyautogui库,pip install pyautogui import os,time import pyautogui as pag try: while True: print ( ...