2014-12-30 57 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沒問題,如果這回答你的問題,你可以接受它。 –

相關問題