【问题标题】:Python - Don't use parent logging handlersPython - 不要使用父日志处理程序
【发布时间】:2020-06-22 13:16:42
【问题描述】:

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

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

现在我有一个模块,它通过侦听队列从多进程中收集日志。我希望这个模块只记录到 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:
            ...
    ...

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

【问题讨论】:

    标签: python python-3.x logging


    【解决方案1】:

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

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

    logger = logging.getLogger("my.sub.logger")
    logger.propagate = False
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      相关资源
      最近更新 更多