[英]Python Logging module: custom loggers
我試圖創建一個用於記錄的自定義屬性(調用者的類名,模塊名稱等),並遇到一個奇怪的異常,告訴我在進程中創建的LogRecord實例沒有必要的屬性。 經過一些測試,我最終得到了這個:
import logging
class MyLogger(logging.getLoggerClass()):
value = None
logging.setLoggerClass(MyLogger)
loggers = [
logging.getLogger(),
logging.getLogger(""),
logging.getLogger("Name")
]
for logger in loggers:
print(isinstance(logger, MyLogger), hasattr(logger, "value"))
這段看似正確的代碼產生:
False False
False False
True True
錯誤或功能?
查看源代碼,我們可以看到以下內容:
root = RootLogger(WARNING)
def getLogger(name=None):
if name:
return Logger.manager.getLogger(name)
else:
return root
也就是說,導入模塊時默認會創建根記錄器。 因此,每次你找根looger時間(傳遞一個錯誤的值,比如空字符串),你會得到一個logging.RootLogger
對象,無論到任何呼叫的logging.setLoggerClass
。
關於正在使用的記錄器類,我們可以看到:
_loggerClass = None
def setLoggerClass(klass):
...
_loggerClass = klass
這意味着全局變量保存將來要使用的記錄器類。
除此之外,查看logging.Manager
(由logging.getLogger
),我們可以看到:
def getLogger(self, name):
...
rv = (self.loggerClass or _loggerClass)(name)
也就是說,如果未設置self.loggerClass
(除非您已明確設置它,否則不會這樣),將使用全局變量中的類。
因此,這是一個功能。 根記錄器始終是logging.RootLogger
對象,其他記錄器對象是根據當時的配置創建的。
logging.getLogger()
和logging.getLogger("")
不返回MyLogger
因為它們返回日志記錄層次結構的根記錄器,如日志記錄文檔中所述 :
logging.getLogger([名稱])
返回具有指定名稱的記錄器,或者,如果未指定名稱,則返回記錄器,該記錄器是層次結構的根記錄器。
因此,當您設置記錄器時:
>>> logging.getLogger()
<logging.RootLogger object at 0x7d9450>
>>> logging.getLogger("foo")
<test3.MyLogger object at 0x76d9f0>
我不認為這與你發布帖子的KeyError有關。 您應該發布導致該異常的代碼( test.py
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.