簡體   English   中英

在Python中的模塊之間記錄

[英]Logging between modules in Python

我正在學習使用標准Python庫文檔進行日志記錄,似乎缺少了一些瑣碎的東西。 我想登錄多個模塊,但僅在主文件中配置每個實例。 我認為我做錯的是basicConfig僅適用於控制根記錄程序的功能,但我感到困惑。

你能指出我正確的方向嗎? 提前致謝。

# main.py
import logging
import module_log

logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger(__name__)

def test1():
    logger.warning("This one is not showing in log but that is what I expect")
    module_log.test2()

if __name__ == "__main__":
    test1()


# module.py
import logging
logger = logging.getLogger(__name__)

def test2():
    logger.warning("This one shouldn't be showing in log but it is")

編輯1:更新了代碼以更好地說明問題。

編輯2:我想我找到了問題的根源,甚至以為我不完全理解為什么。 我不是直接執行main.py,而是從Maya(3d軟件)解釋器中調用它(但是Python解釋器也會發生同樣的情況)如果運行:

>>> import main_log
>>> main_log.test1()

有用! 但是后來我更改了main_log.py來更改調試級別。 我習慣於在更新模塊時運行“ reload()”,但是對於此特定模塊,它似乎無法正常工作,因此它始終顯示相同的結果,並且無論調試級別如何,為什么我總是得到相同的結果。

>>> reload(main_log)
>>> main_log.test1()

到目前為止,我唯一的解決方法是完全關閉Maya並重新打開它(猜測在python解釋器中也會發生同樣的情況)。 我將不勝感激!

從某種意義上說,是的, basicConfig僅配置根記錄器。 但是,從logging.getLogger獲得的任何記錄器都將從根記錄器繼承其配置。

如果您想要模塊中記錄器的特殊行為,請使用Logger.addHandlerLogger.setLevel方法在模塊中對其進行配置,或者依靠主應用程序使用logging.config.fileConfig ,以便所有記錄器的配置可以通過配置文件進行設置。 然而,一般來說你的模塊應該關注與記錄的內容 ,並把它留給任何使用該模塊來確定 ,如果任何地方,記錄的消息被發送。

看來您的問題可能是因為main.pyimport module調用最終在您的logging.basicConfig()調用之前在module.py運行了logging.getLogger() ,這將獲得配置為默認警告級別的記錄器。

嘗試避免在模塊范圍內調用getLogger()

請注意,您的getLogger(__name__)調用將在不同模塊之間返回不同的記錄器對象,因為__name__是被調用的單個模塊的名稱。

如果您不是在編寫多線程程序,則只需在__main__函數中調用logging.basicConfig()可能會更簡單,並且讓所有模塊都使用logging.warning()logging.error()等進行日志記錄然后,您可以將格式化程序傳遞給logging.basicConfig()調用,以在日志中顯示文件名,行號等,以記錄發出該日志的代碼行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM