2017-08-02 105 views
0

所以我想在我的Python程序中實現日誌記錄。目標是設置它以便創建一個日誌文件,並且記錄程序通過它的各個模塊執行的所有事情(根據日誌記錄級別)。這是我當前的代碼是什麼樣子:Python日誌,不寫入文件

日誌配置文本文件:

#logging.conf 
[loggers] 
keys=root,MainLogger 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=consoleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_MainLogger] 
level=DEBUG 
handlers=consoleHandler 
qualname=MainLogger 
propagate=0 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=consoleFormatter 
args=(sys.stdout,) 

[formatter_consoleFormatter] 
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%lineno)04d | %(message)s 

外部模塊到測試日誌:

#test.py 
import logging 

logger = logging.getLogger(__name__) 

def testLog(): 
    logger.debug("Debug Test") 
    logger.info("Info Test") 
    logger.warning("Warning Test") 
    logger.error("Error Test") 

主文件:

#__init__.py 
import logging 
import logging.config 
from datetime import datetime 

logging.config.fileConfig('logging.conf', disable_existing_loggers = False) 
logger = logging.getLogger('MainLogger') 
fileHandler = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) 
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') 
fileHandler.setFormatter(formatter) 
logger.addHandler(fileHandler) 

if __name__ == "__main__": 

    import test 
    logger.debug("Debug Test") 
    test.testLog() 

目前,當我運行時,所有的日誌消息當前都在使用IDLE3 shell顯示和日誌文件正在創建。但是在日誌文件本身中,正在記錄的唯一消息是來自__init__.py的「調試測試」。在test.py模塊中沒有任何消息正在記錄在日誌文件中。

我的問題是什麼?

回答

0

test.py中,它會抓取一個logger對象,之後再在__init__.py中對其進行配置。確保在抓取任何記錄器實例之前先配置記錄模塊。

+0

解決方案是將'logger = logging.getLogger(__ name __)'行移動到'testLog()'方法的內部?這就是說,這意味着我使用的每個模塊中的每個方法都應該通過創建一個存在於該方法範圍內的日誌記錄對象來啓動該方法? – Skitzafreak

+0

沒有,因爲你得到一個記錄器對象的功能之外沒有幫助。在導入測試之前,''__init __。py''中的''fileConfig'調用將移到頂層,這是加載軟件包時首先要執行的操作 –

+0

Ahh好的。因此,導入日誌記錄庫,實現日誌記錄的東西,導入和運行其他的東西。 Gotcha – Skitzafreak