2017-07-06 44 views
0

我有這樣一段代碼來設置我的記錄器在Python:日誌記錄級別隨機變化,而不是總是寫入文件

#Configure logging 
    logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
         datefmt='%m-%d %H:%M', 
         filename= "log.txt", 
         level = logging.getLevelName('DEBUG')) 


    print(logging.getLogger().getEffectiveLevel()) 

但是從打印語句的輸出有時是這樣的:

30 

等次是這樣的(這是正確的):

10 

但往往即使日誌記錄級別爲設置爲正確的數字,它不記錄任何文件,但其他時間它的工作。我需要做些什麼來確保我的日誌記錄級別設置正確?

*編輯:下面是我的解決方案,基於@randomir的建議。 **編輯:我必須進行第二次更改,我在調用logging.basicConfig()之後設置關卡,否則記錄級別仍然沒有一致地調用。 `logging.getLogger()。setLevel(...)行現在似乎工作。

我創建了一個新類:Logger.py。

import logging 

class Logger(object): 
    def __init__(self): 
    logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
         datefmt='%m-%d %H:%M', 
         filename= "log.txt") 

    logging.getLogger().setLevel(logging.getLevelName("DEBUG")) 

    print(logging.getLogger().getEffectiveLevel()) 

而且現在不是在我的啓動類直接配置基本配置我實例化記錄器類一次:

from Logger import Logger 
import logging 

class LaunchPython(object): 
    #Configure Logging 
    Logger() 

    logging.info("Application has started") 

在調用我只是把import logging頂部的記錄器的所有後續類然後做logging.info(...)logging.debug(....)。無需導入Logger.py類並重新實例化它。

+0

你有更多的上下文嗎?如果我簡單地複製/粘貼代碼示例並運行它,我可靠地獲得10. –

+0

您是否在使用相同的記錄器?是否聲明過一次,然後導入到所有模塊中? – PRMoureu

+0

@Finch_Powers通常它會在第一次從新的QT控制檯運行應用程序時輸出正確的調試編號,但是如果隨後運行它,則會開始大部分輸出30. – EliSquared

回答

2

的爲您的應用程序創建一個根記錄(這是名爲root一個記錄器,你可以用logging.getLogger('root'),或logging.getLogger()得到它)。

訣竅是root記錄器在第一次調用任何記錄函數(如logging.info())時(如果它不存在),將使用默認值(如level=30)創建。因此,請確保在任何其他應用程序的日誌記錄之前致電basicConfig()

您可以通過將記錄器配置提取到單獨的模塊(如logger.py),然後在每個模塊中導入該模塊來完成此操作。或者,如果您的應用程序有一箇中央入口點,只需在那裏進行配置。請注意,您調用的第三方功能如果不存在,也會創建root記錄器。

另外請注意,如果您的應用程序是多線程:

注意 此功能應該在主線程其他線程啓動之前調用。在2.7.1和3.2之前的Python版本中,如果此函數是從多個線程中調用的,則可能(極少數情況下)處理程序將不止一次添加到根記錄器,從而導致意外的結果,如消息在日誌中被複制。

+0

是創建一個單獨的Logger.py類工作喜歡魅力。我根據您的建議添加了我創建的解決方案。 – EliSquared

+0

太好了,我很高興你能成功。 – randomir

相關問題