Python logger重复记录同一条日志

15 投票
5 回答
8293 浏览
提问于 2025-04-16 02:41

我有一个这样的日志初始化函数:

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')

奇怪的是,我得到的错误信息被写了两次,但只能捕获到一次。当我把 logger.error('哎呀,我们遇到一个错误') 换成 print "测试" 时,我只看到 "测试" 打印了一次。

这可能是什么问题,解决办法是什么呢?

5 个回答

3

我觉得你可能不小心给日志记录器加了两个处理程序。也许在某个时候,系统自动添加了一个处理程序。

13

我也遇到过同样的问题,后来找到了这个页面。没错,我当时也创建了多个处理器。在 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
15

每次你调用那个函数时,都会给根日志记录器添加一个新的文件处理器:调用 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() 返回任何值)

撰写回答