当前位置:   article > 正文

python停止打印日志/重复打印日志_python logging 关闭日志文件的方法

python logging 关闭日志文件的方法

问题描述:

用类实现了一个需求,每次实例化时,会根据传入的参数,在不同的日志文件中写入日志,即要求类的每个实例根据传参写入不同的日志文件。
运行后发现 ,运行到根据c2配置的实例 时,c2实例的日志出现在了c1的日志文件中,控制台日志也是重复的,即使把实例 del 删除也还是会打印重复日志。

主要代码如下:

class KKK
	def __init__(self, log_name, base_path)
	    self.log_name= log_name
	    self.base_path = base_path
	    
	def start():
	    ....
	    pass
	    
    def getLogger(self):
        # logger = logging.getLogger('%s_%d' % (self.log_name, int(time.time())))
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter("%(asctime)s|%(lineno)04d|%(levelname)-8s|%(message)s")

        # 控制台日志
        StreamHandler = logging.StreamHandler()
        StreamHandler.setFormatter(formatter)
        StreamHandler.setLevel(logging.INFO)

        # 较详细的日志
        FileHandler = logging.FileHandler(filename=os.path.join(self.base_path, '%s.log' % self.log_name), mode='a', encoding='utf8')
        FileHandler.setFormatter(formatter)
        FileHandler.setLevel(logging.DEBUG)
        
        logger.addHandler(StreamHandler)
        logger.addHandler(FileHandler)

        return logger


if __name__ == '__main__':
    c1 = {...}
    c2 = {...}
    for cc in [c1, c2]:
        kkk = KKK(**cc)
        kkk.start()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

问题原因

logging.getLogger( ), 并未传递参数, 所以得到的self.logger是RootLogger。RootLogger是一个python程序内全局唯一的,所有Logger对象的父类,对RootLogger的设定,均会影响到后续的日志。

解决办法

方法1

getLogger设置参数

logger = logging.getLogger('%s_%d' % (self.course_name, int(time.time())))
  • 1
方法2

类实例销毁前清空log.handlers

    def __del__(self):
        self.stopLogger()
        pass

    def stopLogger(self):
        # for fh in self.logger.handlers:
        #     print(fh.get_name, '+++++')
        #     if isinstance(fh, logging.FileHandler):
        #         print('close handler')
        #         fh.close()
        
        self.logger.warning('关闭日志, %s , %s' % (self.course_name, self.logger.name))
        self.logger.handlers.clear()
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

参考

https://blog.csdn.net/weixin_42503009/article/details/116171149
https://blog.csdn.net/weixin_43997319/article/details/123990742

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/611443
推荐阅读
相关标签
  

闽ICP备14008679号