python日志检索特定的处理程序

时间:2012-11-21 09:52:08

标签: python logging

我们正在开发一个我们想要设置日志记录系统的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全局字典来存储我创建的处理程序的实例。我找不到更好的方法。在那个设计中,可以说,因为我只是为每个记录器插入一个处理程序,我的记录器对象的处理程序属性应该没问题,但我正在寻找更通用的东西(即,如果有一天插入几个处理程序,怎么办?我的一个记录器?)

您如何看待这个?

非常感谢

埃里克

2 个答案:

答案 0 :(得分:0)

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

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

请注意,处理程序的日志级别与此日志级别无关,并且处理程序仅在达到两个级别时记录。

答案 1 :(得分:0)

有点晚了,但这是一种方法:

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

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}")