Python - 不要使用父日志记录处理程序

Tom*_*ock 3 python logging python-3.x

我有用四个处理程序定义的根记录器;

  • 文件处理程序错误
  • 文件处理程序信息
  • 文件处理程序调试
  • 流处理器信息

现在我有一个模块,它通过侦听队列从多进程收集日志。我希望这个模块只记录到 FileHandlers。我尝试使用以下代码来实现这一点;

class ModuleLogger(Singleton):
    def __init__(self):
        # Create a queue to stash the messages
        self.queue = Queue(-1)

        # Start thread
        thread = Thread(target=self.__receive)
        thread.daemon = True
        thread.start()

    def __receive(self):
        # Keep checking the queue for new logging messages
        while 1:
            try:
                record = self.queue.get()

                # Exit on None value
                if record is None:
                    break
               
                logger = logging.getLogger(record.name)
                logger.setLevel(logging.DEBUG)

                for handler in logging.getLogger().handlers:
                    if type(handler) != type(logging.StreamHandler()):
                        logger.addHandler(handler)

                logger.handle(record)
        except Exception:
            ...
    ...
Run Code Online (Sandbox Code Playgroud)

但是,消息仍然会记录到标准输出。不过,当我打印 logger.handlers 时,它仅显示 FileHandlers。这就引出了这篇SO帖子的问题;如何确保记录器不使用其父处理程序?

Spo*_*ser 5

propagate我认为这只是在您的子记录器上设置属性的情况。

https://docs.python.org/3/library/logging.html#logging.Logger.propagate

logger = logging.getLogger("my.sub.logger")
logger.propagate = False
Run Code Online (Sandbox Code Playgroud)

您只需要对专门命名的子记录器执行一次此操作,甚至可以使用预先的日志记录配置来设置它: https: //docs.python.org/3/library/logging.config.html#module-logging。配置