有没有一种简单的方法可以将处理程序添加到记录器对象?

时间:2014-12-30 12:24:53

标签: python logging

我必须编写一个代码来将消息记录到文件和stdout。我通读了日志记录模块并完成了任务。但只是想知道是否有任何有效的方法将处理程序关联到Logger对象?

logger = logging.getLogger('TEST')
logger.setLevel(logging.DEBUG)

#create a file handler

file_log_handler = logging.FileHandler('logfile.log',mode='w')
#logger.addHandler(file_log_handler)

#create a stderr_handler

stderr_log_handler = logging.StreamHandler()
stderr_log_handler.setLevel(logging.ERROR)
#logger.addHandler(stderr_log_handler)

# Create formattar 
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# Add Handler to Formattar
file_log_handler.setFormatter(formatter)
stderr_log_handler.setFormatter(formatter)

# add logger to Handler
logger.addHandler(file_log_handler,stderr_log_handler)

# application code:

logger.info('debug message')
logger.warning('This is a warning message')
logger.debug('This is a debug message')
logger.error('This is a error message')

在上面的代码中,我有两个处理程序(file_log和stderr_log),当像这样添加时

logger.addhandler(file_log_handler)
logger.addhandler(stderr_log_handler) 

有效,但在这样的单一陈述中给出:

logger.addhandler(file_log_handler,stderr_log_handler)

不起作用。我尝试使用它作为列表,但没有运气。

有没有一种有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

嗯,从source code可以看出,处理程序需要安全(请注意_acquireLock()_releaseLock(),因为可以共享记录器

您可以做的是:

logger.handlers.extend([file_log_handler, stderr_handler])

但我建议反对

避免重复的最好方法是我们程序员总是这样做...写一个函数:

def add_many_handlers(logger, handler_list):
    for handler in handler_list:
        logger.addHandler(handler)

addHandler来源:

def addHandler(self, hdlr):
    """
    Add the specified handler to this logger.
    """
    _acquireLock()
    try:
        if not (hdlr in self.handlers):
            self.handlers.append(hdlr)
    finally:
        _releaseLock()