【问题标题】:python logging retrieve specific handlerpython logging 检索特定处理程序
【发布时间】:2012-11-21 09:52:07
【问题描述】:

我们在一个 Python 程序/库上工作,我们想为其设置一个日志系统。基本上,我们想在终端上或文件上登录。为此,我们将使用标准发行版中嵌入的出色日志记录包。

日志级别应由用户通过其首选项进行自定义。我的问题是如何检索连接到记录器的处理程序之一?我在想有点像这样的事情:

import logging

class NullHandler(logging.Handler):
    def emit(self,record):
        pass

HANDLERS = {}
HANDLERS['console'] = logging.StreamHandler()
HANDLERS['logfile'] = logging.FileHandler('test.log','w')

logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(HANDLERS['console'])
logging.getLogger('logfile').addHandler(HANDLERS['logfile'])

def set_log_level(handler, level):
    if hanlder not in HANDLERS:
        return

    HANDLERS[handler].setLevel(level)

def log(message, level, logger=None):

    if logger is None:
        logger= HANDLERS.keys()

    for l in logger:
        logging.getLogger(l).log(level, message)

如您所见,我的实现意味着使用 HANDLERS 全局字典来存储我创建的处理程序的实例。我找不到更好的方法来做到这一点。在那个设计中,可以说因为我只是为每个记录器插入了一个处理程序,所以我的记录器对象的 handlers 属性应该没问题,但我正在寻找更通用的东西(即,如果有一天一个多个处理程序被插入,该怎么办到我的一个记录器?)

您对此有何看法?

非常感谢

埃里克

【问题讨论】:

    标签: python logging


    【解决方案1】:

    您不仅可以设置处理程序的级别,还可以设置记录器的级别:

    import logging
    class NullHandler(logging.Handler):
        def emit(self,record):
            pass
    
    logging.getLogger().addHandler(NullHandler())
    logging.getLogger('console').addHandler(logging.StreamHandler())
    
    logging.getLogger('console').info("foo")
    logging.getLogger('console').setLevel(1000)
    logging.getLogger('console').info("foo")
    logging.getLogger('console').setLevel(1)
    logging.getLogger('console').info("foo")
    

    请注意,处理程序的日志级别独立于这一级别,并且仅在达到这两个级别时才会记录处理程序。

    【讨论】:

      【解决方案2】:

      有点晚了,但这里有一个方法:

      当您创建处理程序时,您可以设置名称,如下所示:

      import logging
      
      stream_handler = logging.StreamHandler()
      # Set name for handler
      stream_handler.name = "stream_handler"
      
      logging.getLogger().addHandler(stream_handler)
      
      # Use name to find specific handler from list of all handlers for the logger
      for handler in logging.getLogger().handlers:
          if handler.name == "stream_handler":
              print(f"Found stream_handler={stream_handler}")
      

      【讨论】:

        猜你喜欢
        • 2012-09-15
        • 2011-09-14
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多