我有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函數返回相同日誌的其他實例的最簡單方法嗎?
不幸的是,我一直在使用'Other.py'主函數作爲驗證測試,我希望能夠做到這一點。我不能這樣做,如果我只是簡單地調用logging.getLogger(),就好像我正在做驗證測試一樣,我不會設置日誌(日誌將在Runner.py中設置) –