簡體   English   中英

Python Logging模塊:自定義記錄器

[英]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.

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