[BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法
最近再写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 解决办法的更多相关文章
- SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法
discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...
- 调用list(itertools.combinations(keys,3))出现MemoryError的解决办法
在python3.6中,如下例子: keys = list(newKeywords.keys()) resultkeys = list(itertools.combinations(keys,3)) ...
- 检索 COM 类工厂中 CLSID 为 {{10020200-E260-11CF-AE68-00AA004A34D5}} 的组件时失败解决办法
检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下: 第一步:首先将msvcr71.dll, SQLDM ...
- python写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
在写入TXT文件时,某些页面总是报UnicodeEncodeError: ‘gbk’ codec can’t encode character错误,网上找了半天也没找到解决办法. 后来终于找到了解决办 ...
- python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...
- 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()是无法解决编码问题.尝试了无数办法,都无法 ...
- 调用discuz编辑器发布帖子显示html代码的解决办法
<!--{echo htmlspecialchars_decode(discuzcode($post[message], , , , , , , , , , ));}--> 在discuz ...
随机推荐
- java权限控制以及变量的初始化
知识是靠积累的,不断的温习会帮你让你遇到许多问题,解决完这些问题之后,会收获许多,233333333333333. 1.java访问控制符 2.java变量初始化问题 默认构造方法的名字与类名相同,它 ...
- RadioButtonList根据值触发OnSelectedIndexChanged事件
Insus.NET有使用Iframe来处理另外一个站点的enter form,由于需要自动循环填入数据,免去人手操作.但是原来的Enter from有RadioButtonList控件以及OnSele ...
- Html.DropDownListFor练习(2)
下午有做了练习<Html.DropDownListFor练习>http://www.cnblogs.com/insus/p/3382575.html 在实现过程中,需要创建一个List&l ...
- WebFrom与MVC异同
一.共同点 它们共用一套管道机制. 二.不同点: 1.开发方式: webform开发方式 第一步:前台页面(*.aspx)+后置代码类(*.cs) 第二步:前台页面(*.aspx)+一般处理程序(*h ...
- C语言关于形参与实参,以及系统堆栈的关系
- Tomcat9.0环境搭建与源码编译
使用IntelliJ IDEA 搭建Tomcat9.0项目 准备条件: 下载源码 这里我们下载的Tomcat的源码版本是9.0.12. 下载地址: https://tomcat.apache ...
- A simple problem(hdu2522)
A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- ORM--Entity Framework 学习(01)
关键词:Entity Framework:微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.EF提供变更跟踪.唯一性约束.惰性加载.查询事物等.开发 ...
- js中Date 方法
Date (对象) Date 对象能够使你获得相对于国际标准时间(格林威治标准时间,现在被称为 UTC-Universal Coordinated Time)或者是 Flash 播放器正运行的操作系统 ...
- 教你用Cordova打包Vue项目
现在国内越来越多的开发者使用Vue开发混合app,但是当大家开发完成过后才发现不知道该怎么将Vue项目打包成app. 据我现在的了解打包Vue项目目前流行的就是使用weex和cordova.weex是 ...