2010-08-12 85 views
8

我有這樣的記錄器初始化功能:蟒蛇記錄器記錄同一條目多次

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger 

而且在我的代碼的一些部分,我有這樣的異常捕獲:

logger = generate_logger() 
except AttributeError: 
    logger.error('Opps we got an error') 

古怪,我得到同樣的錯誤寫2次,只能打一次,一旦我改變logger.error('Opps we got an error')print "test",我得到「測試」打印一次。

什麼是問題和解決方案。

Regards

回答

9

您每次調用該函數時都會向根記錄器中添加一個新的FileHandler:每次調用logger.getLogger而不使用name參數時都會返回相同的記錄器對象。

你應該叫generate_logger()只有一次,然後簡單地通過調用logger.getLogger()得到相同的記錄對象:

generate_logger() 

# .... some time later 

log = logger.getLogger() 
except AttributeError: 
    log.error('Opps we got an error') 

(請注意,你不需要generate_logger()現在返回一個值)

2

您可能有兩個處理程序會轉到相同的結果日誌。

您創建了多少個處理程序?你執行多少次generate_logger?每次執行generate_logger時,都會爲同一個文件創建另一個處理程序,從而導致潛在的重複。

3

我想你可能會以某種方式將兩個處理程序添加到記錄器中。也許在某個時候添加了一個隱式處理程序。

9

我也遇到了同樣的問題,並遇到此頁面。是的,我還創建了多個處理程序。在generate_logger()中,你可以檢查是否有其他處理程序並刪除它們。

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    # Reset the logger.handlers if it already exists. 
    if logger.handlers: 
     logger.handlers = [] 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger