python logging 输出多重日志

发布时间 2023-09-06 17:35:50作者: MissSimple

项目中遇到logging总是输出双重日志的问题,采用判断是否有handler并且删除handler,然后新建handler的方式,仍然存在该问题,最后发现,原来是root下还有一个handler,最后删除root下的handler,解决问题。

import logging

logger = logging.getLogger(str(uuid.uuid1()))

if logger.hasHandlers():  

    for i in logger.handlers:

         logger.removeHandler(i)

sh = logging.StreamHandler()

sh.setFormatter(fmt)

logger.addHandler(sh)

 

最后更改为:

if logger.hasHandlers():  

    for i in logger.handlers:

         logger.removeHandler(i)

if logger.root.hasHandlers():  

    for i in logger.root.handlers:

         logger.root.removeHandler(i)

sh = logging.StreamHandler()

sh.setFormatter(fmt)

logger.addHandler(sh)

 

那么root下的handler怎么来的呢?

logger 在没有 handler 的情况下,其本身是不具备输出消息能力的,streamHandler 的第一个例子已经说明了这个问题。但是为什么 logger.warning(msg) 和 logger.error(msg) 能够在不配置 handler 的情况下,输出日志呢?这其实是 logging 模块的保护机制,对于 warning 和 error 级别的消息,如果消息的日志等级大于 logger 的日志等级,且 logger 没有配置任何的 handler,则会调用 logging 模块内置的 streamHandler 来输出信息。