2014-12-30 58 views
0

我必须编写代码将消息记录到文件和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) 

不起作用。我试着用List作为List,但没有运气。

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

+0

没有,API只允许添加单个处理器对象。为什么这么低效?这不像你在这里增加1000个处理程序。 –

+0

谢谢@fredtantini ..对不起,如果我使用低效misappropirate一词。我只是想知道是否提供多个处理程序addHandler()是否支持.. – user596922

回答

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() 
+0

谢谢@Reut Sharabani。这有助于! – user596922

+0

@ user596922没问题,如果这回答你的问题,你可以接受它。 –

相关问题