python logger多次记录相同的条目

时间:2010-08-12 12:16:34

标签: python exception logging

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

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",我打印“test”一次。

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

此致

5 个答案:

答案 0 :(得分:12)

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

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

generate_logger()

# .... some time later

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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

43类单例(类型):
 44“”“
 45定义一个实例操作,使客户端可以访问其唯一的
 46个实例。
 47“”“
 48
 49 def init (cls,名称,基数,attrs,** kwargs):
 50个super()。初始(名称,基数,属性)
 51 cls._instance =无
 52
 53 def call (cls,* args,** kwargs):
 54如果cls._instance为None:
 55 cls._instance = super()。调用(* args,** kwargs)
 56返回cls._instance
 57
 58
 59
 60 def _setup_logger(名称,日志文件,级别=日志记录.INFO):
 61“”“功能设置所需的记录器数量”“”
 62
 63处理程序= logging.FileHandler(log_file)
 64 handler.setFormatter(formatter)
 65 logger = logging.getLogger(name)
 66 logger.setLevel(level)
 67 logger.addHandler(handler)
 68
 69返回记录器
 70
 71类Logger(metaclass = Singleton):
 72
 73 def init (自身,文件名,级别):
 74否(isinstance(file_name,str)和
 75 isinstance(level,int)):
 76提高ValueError(“ Invalid Args”)
 77
 78 self.log_inf = _setup_logger('inf',file_name +'。inf',level)
 79 self.log_err = _setup_logger('err',file_name +'。err',level)