欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

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

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

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

 [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

 

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

 [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

 

 

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

 [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

 

我们每次在实例化 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()方法,如下:

 [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

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

 [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

附上源码: