2014-12-02 70 views
2

我的問題是設計問題。我有以下Logger類:Python日誌記錄重複行

import logging, logging.handlers 

class Logger(object): 
    def __init__(self, log_filename, name): 
     self.LOG_FILENAME = log_filename 

     logging.basicConfig(format='%(asctime)s %(message)s') 
     formatter = logging.Formatter(
      '%(asctime)s - %(levelname)s - %(message)s') 
     loghandler = logging.handlers.RotatingFileHandler(
      self.LOG_FILENAME) 
     loghandler.setFormatter(formatter) 
     self.logger = logging.getLogger(name) 
     self.logger.setLevel(logging.INFO) 
     self.logger.addHandler(loghandler) 

    def getLogger(self): 
     return self.logger 

上下文是下面,我有幾個模塊將利用這個類,每類是無關的他人或記錄的,所以每一個類實例化一個新Logger類(即使他們需要編寫到同一個文件),問題是,如果我有2類,需要寫同一個記錄器,我得到重複的線條,這再現了錯誤:

def a(): 
    log = Logger(log_filename='test.log', name='test') 
    logger = log.getLogger() 
    logger.info('A') 

def b(): 
    log = Logger(log_filename='test.log', name='test') 
    logger = log.getLogger() 
    logger.info('B') 

所以如果我打電話a()我會得到我所期望的:2014-12-02 10:26:40,665 - INFO - A,但如果現在我打電話b()我會得到:

2014-12-02 10:26:40,665 - INFO - A 
2014-12-02 10:26:48,553 - INFO - B 
2014-12-02 10:26:48,553 - INFO - B 

等等,我知道記錄器是一個Singleton類和錯誤必須是在我的記錄器類,但我認爲getLogger與記錄器的名稱將返回「相同」的日誌類實例。

回答

4

你的假設是正確的,並且是問題的原因。 (在這兩個電話等情況下)使用相同的name參數

self.logger = logging.getLogger(name) # <-- same logger for same "name"! 
    self.logger.setLevel(logging.INFO) 
    self.logger.addHandler(loghandler) 

隨着每個實例:您要添加很多處理程序同一記錄這裏

# same name! 
def a(): 
    log = Logger(log_filename='test.log', name='test') 
... 
def b(): 
    log = Logger(log_filename='test.log', name='test') 

同一記錄器變得更處理程序。