2013-10-29 16 views
2

我正在使用下面的代碼使用記錄模塊在單獨的日誌文件中寫入錯誤和調試消息。但我希望只有在設置了特定環境變量的情況下才能進行日誌記錄。在下面的代碼中,我通過設置logger.disabled=True來關閉日誌記錄。但是,我注意到當我的應用程序執行完成時,空白日誌文件存在。我添加了一個檢查來設置logger.disabled=True語句後刪除這些文件,但它說文件不存在。什麼時候生成這些文件 - 在腳本執行結束時(即使記錄器被禁用),是否可以防止空文件的寫入?如果記錄器被禁用,則禁止創建空日誌文件

class LevelFilter(logging.Filter): 
    def __init__(self, level): 
     self.level = level 
    def filter(self, record): 
     return record.levelno == self.level 

logger = logging.getLogger("exceptionsLogger") 
debugLogFileHandler = logging.FileHandler("Debug.log", mode='w') 
errorLogFileHandler = logging.FileHandler("Error.Log", mode='w') 
formatter = logging.Formatter('%(message)s') 
errorLogFileHandler.setFormatter(formatter) 
debugLogFileHandler.setFormatter(formatter) 
logger.addHandler(debugLogFileHandler) 
logger.addHandler(errorLogFileHandler) 
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG)) 
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR)) 

logger.setLevel(logging.DEBUG) 
logger.disabled = True 
+0

我的猜測是當第一次使用記錄器時會發生這種情況。也許'禁用'屬性檢查得太晚了。 –

回答

2

請參閱Python標準庫中的logging/__init__.py。有FileHandler類,它有方法__init__()

FileHandler.__init__有自變量delay這使得處理程序延遲創建實際的StreamHandler直到第一個消息發出。在您實例化FileHandler實例時,您不使用此參數並調用open()的模式「w」。在將logger.disabled設置爲True之前執行此操作。

因此,如果您以後不發送消息,您仍然已經打開了空文件。

爲了避免這種情況,可以創建具有參數延遲的文件處理程序,通過那裏傳遞True或僅在需要時實例化和分配處理程序。 logger.disabled不會幫助您避免創建文件。