当前位置:   article > 正文

【python】logging日志打印重复输出冗余日志_python logging重复输出

python logging重复输出

在这里插入图片描述
问题描述:
日志重复输出,且数量递增。

原因分析:没有移除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)
 
  • 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
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
'
运行
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/963222
推荐阅读
相关标签
  

闽ICP备14008679号