当前位置: 移动技术网 > IT编程>脚本编程>Python > [python] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

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

2018年08月15日  | 移动技术网IT编程  | 我要评论

黄开胜,六人小品剧本 搞笑,五味吧

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

 

附上源码:

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网