首页 > 技术文章 > [BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

aziji 2018-08-15 11:14 原文

最近再写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 看看输出结果是否符合预期(这次日志就没有再重复打印了,看着也爽了):

 

附上源码:

 

推荐阅读