【问题标题】:python logger logging same entry numerous timespython logger多次记录相同的条目
【发布时间】:2011-03-28 21:46:20
【问题描述】:

我有一个这样的记录器初始化函数:

def generate_logger():
    import logging
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
    FORMAT = "%(asctime)s : %(message)s"
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    fh = logging.FileHandler(LOG_FILENAME)
    formatter = logging.Formatter(FORMAT)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    return logger

在我的代码的某些部分,我遇到了这样的异常:

logger = generate_logger()
except AttributeError:
    logger.error('Opps we got an error')

奇怪的是,我写了 2 次相同的错误,并且只能捕获一次,一旦我将 logger.error('Opps we got an error') 更改为 print "test",我会打印一次“测试”。

可能是什么问题和解决方案。

问候

【问题讨论】:

    标签: python exception logging


    【解决方案1】:

    每次调用该函数时,您都在向根记录器添加一个新的 FileHandler:对 logger.getLogger() 的调用不带名称参数每次都会返回相同的记录器对象。

    您应该只调用一次generate_logger(),然后通过调用logger.getLogger() 来获取相同的记录器对象:

    generate_logger()
    
    # .... some time later
    
    log = logger.getLogger()
    except AttributeError:
       log.error('Opps we got an error')
    

    (请注意,您现在不需要generate_logger() 来返回值)

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题并遇到了这个页面。是的,我还创建了多个处理程序。在generate_logger()中,你可以检查是否还有其他的handlers并删除它们。

      def generate_logger():
          import logging
          LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
          FORMAT = "%(asctime)s : %(message)s"
          logger = logging.getLogger()
          logger.setLevel(logging.INFO)
          # Reset the logger.handlers if it already exists.
          if logger.handlers:
              logger.handlers = []
          fh = logging.FileHandler(LOG_FILENAME)
          formatter = logging.Formatter(FORMAT)
          fh.setFormatter(formatter)
          logger.addHandler(fh)
          return logger
      

      【讨论】:

        【解决方案3】:

        我认为您可能会以某种方式将两个处理程序添加到记录器中。也许在某个时候会添加一个隐式处理程序。

        【讨论】:

          【解决方案4】:

          您可能有两个处理程序访问相同的结果日志。

          您要创建多少个处理程序?你执行了多少次generate_logger?每次执行 generate_logger 时,都会为同一个文件创建另一个处理程序,从而导致潜在的重复。

          【讨论】:

            【解决方案5】:

            use 可以为此使用单例设计模式:

            43 类单例(类型):
            44 """
            45 定义一个实例操作,让客户端访问其唯一的
            46 个实例。
            47 """
            48
            49 def init(cls, name, bases, attrs, **kwargs):
            50 super().init(名称、基数、属性)
            51 cls._instance = 无
            52
            53 def 调用(cls, *args, **kwargs):
            54 如果 cls._instance 为无:
            55 cls._instance = super().call(*args, **kwargs)
            56 返回 cls._instance
            57
            58
            59
            60 def _setup_logger(name, log_file, level=logging.INFO):
            61 """函数设置任意数量的记录器"""
            62
            63 处理程序 = logging.FileHandler(log_file)
            64 handler.setFormatter(格式化程序)
            65 记录器 = logging.getLogger(名称)
            66 logger.setLevel(级别)
            67 logger.addHandler(处理程序)
            68
            69 返回记录器
            70
            71 类 Logger(metaclass=Singleton):
            72
            73 def init(自我,文件名,级别):
            74 如果不是 (isinstance(file_name, str) 和
            75 isinstance(level, int)):
            76 引发 ValueError(“无效参数”)
            77
            78 self.log_inf = _setup_logger('inf', 文件名+'.inf', 级别)
            79 self.log_err = _setup_logger('err', file_name+'.err', 级别)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-03-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-01-11
              • 1970-01-01
              相关资源
              最近更新 更多