2011-09-07 98 views
4

我有3個python模塊。來自多個模塊的Python日誌記錄問題

LogManager.py 
Runner.py 
Other.py 

Runner.py是在事件鏈的第一主模塊,並且從內部Other.py該模塊的功能被調用。

所以,內Runner.py我有一個函數調用LogManager.py

logger = LogManager.get_log() 

,並從那裏,我可以做簡單的記錄,例如logger.critical("OHNOES")

我需要get_log函數做什麼,類似於單例模式,如果記錄器尚未設置,它將設置記錄器並返回它。否則,它只會返回記錄器。

內容LogManager.py的:

import logging 

def get_log(): 
    logger = logging.getLogger('PyPro') 
    logger.setLevel(logging.DEBUG) 

    # create file handler which logs even debug messages 
    fh = logging.FileHandler('pypro.log') 
    fh.setLevel(logging.DEBUG) 

    # create console handler with a higher log level 
    ch = logging.StreamHandler() 
    ch.setLevel(logging.WARNING) 

    # create formatter and add it to the handlers 
    fhFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') 
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s') 
    fh.setFormatter(fhFormatter) 
    ch.setFormatter(chFormatter) 

    # add the handlers to logger 
    logger.addHandler(ch) 
    logger.addHandler(fh) 

    logger.info("-----------------------------------") 
    logger.info("Log system successfully initialised") 
    logger.info("-----------------------------------") 

    return logger 

正如你所看到的,LogManager.get_log()將嘗試在每次調用時設置日誌。真的,我有點困惑,究竟發生了什麼......

Runner.py在它的主要方法中調用get_log函數。 Other.py在全局範圍內調用get_log(在導入之後,不在任何函數中)

結果是我所做的所有日誌都記錄了兩次,因爲處理程序是爲記錄器創建的兩次。

我錯過了使get_log函數返回相同日誌的其他實例的最簡單方法嗎?

回答

3

logging模塊已經爲您實現了單態模式 - 當您調用logger.getLogger(name)時,它將創建記錄器,如果它尚未完成並返回它。雖然它不是剛好你要求的,我建議只需將get_log()重命名爲setup_log(),因爲這就是它的作用。然後,您可以在代碼的開始處撥打setup_log()一次。之後,當你真的需要記錄器時,只需使用logging.getLogger(),它將返回已配置的記錄器。

+0

不幸的是,我一直在使用'Other.py'主函數作爲驗證測試​​,我希望能夠做到這一點。我不能這樣做,如果我只是簡單地調用logging.getLogger(),就好像我正在做驗證測試一樣,我不會設置日誌(日誌將在Runner.py中設置) –