赞
踩
问题描述:
日志重复输出,且数量递增。
原因分析:没有移除handler
实际上logger = logging.getLogger(“logger”)在执行时,是先检查内存中是否存在一个叫做‘logger.log’的logger对象,存在则取出,不存在则新建。
实例化的logger对象,通过具有‘handlers’这样一个属性来存储 Handler:
logger.handlers最初是一个空列表,执行‘logger.addHandler(sh)’添加一个‘StreamHandler’,输出一条日志;
在第二次被调用时,logger.handlers已经存在一个‘StreamHandler’,再次执行‘logger.addHandler(sh)’就会再次添加一个‘StreamHandler’,此时的logger有两个‘StreamHandler’,输出两条重复的日志;
在第三次被调用时,logger.handlers已经存在两个‘StreamHandler’,再次执行‘logger.addHandler(sh)’就会再次添加一个,此时的logger有三个‘StreamHandler’,输出三条重复的日志
解决方案:在日志记录完之后removeHandler
方法一(推荐):
用前判断,在log方法里做判断,如果这个logger已有handler,则不再添加handler。
方法二:
每次创建不同name的logger,每次都是新logger,不会有添加多个handler的问题。
方法三(兼容性较差,不建议):
每次记录完日志之后,调用removeHandler()把这个logger里的handler移除掉。
# Time:2022 2022/3/2 10:21 # Author: Jasmay # -*- coding: utf-8 -*- import logging import time import os root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) log_dir = os.path.join(root_dir,"logs") if not os.path.exists(log_dir): os.mkdir(log_dir) class DemoLogger(): def log(self): # 创建一个日志器 logger = logging.getLogger("logger") # 设置日志输出的最低等级,低于当前等级则会被忽略 logger.setLevel(logging.INFO) # 判断当前日志对象中是否有处理器,如果没有,则添加处理器 if not logger.handlers: # 创建处理器:sh为控制台处理器,fh为文件处理器 sh = logging.StreamHandler() # 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹 # log_file = os.path.join(log_dir,"{}_log".format(time.strftime("%Y/%m/%d",time.localtime()))) log_file = os.path.join(log_dir,"autotest.log") fh = logging.FileHandler(log_file,encoding="UTF-8") # 创建格式器,并将sh,fh设置对应的格式 formator = logging.Formatter(fmt = "%(asctime)s %(filename)s %(levelname)s %(message)s", datefmt="%Y/%m/%d %X") sh.setFormatter(formator) fh.setFormatter(formator) # 将处理器,添加至日志器中 logger.addHandler(sh) logger.addHandler(fh) return logger # 加法运算 def sum(self,a,b): try: sum = a+b self.log().info("{}+{}={}加法运算正确".format(a,b,sum)) return sum except Exception as error: self.log().error("{}+{}加法运算计算错误".format(a,b,error)) # 测试加法 def test(self): sum1 = self.sum(3,4) sum2 = self.sum("a",21) sum3 = self.sum(9,4) result = DemoLogger().test() if __name__ == '__main__': print(result)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。