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

     

    附上源码:

  • 相关阅读:
    ranger0.5.4-开源安装配置
    Spark Streaming 读取Kafka数据写入ES
    kettle与sqoop的比较
    spark常用算子
    eclipse快捷键
    hive相关操作
    我眼中如何成为一名合格PHP高级开发工程师
    laravel 路由404
    TP5.0 未定义变量
    公众号基本配置(token验证失败)|公众平台测试账号接口配置信息(token验证失败)
  • 原文地址:https://www.cnblogs.com/aziji/p/9480314.html
Copyright © 2020-2023  润新知