簡體   English   中英

子記錄器的默認處理程序是什么?

[英]What is the default handler for the child logger?

我知道根記錄器具有lastResort處理程序,如果未使用logging.basicConfig配置根記錄器處理程序並且用戶使用logging.info/debug/warning/error/critical("some msg")logger = logging.gerLogger()后跟logger.info/debug/warning/error/critical("some msg")

但是對於使用logger = logging.getLogger("someName")創建的子記錄器,當我們編寫logger.info/debug/warning/error/critical("some msg")並且沒有配置處理程序時,當propagate = true ,那么子記錄器是否有任何默認處理程序? 還是回退到祖先的處理程序,然后到根記錄器的處理程序,如果祖先/根記錄器沒有處理程序,然后到根記錄器lastResort處理程序?

如果將propagate 設置為false,那么是否會為子記錄器分配一些默認處理程序?

簡短回答: logging.lastResort

長答案:

根據文檔,如果沒有提供日志配置,那么:

事件是 output,使用存儲在 logging.lastResort 中的“最后的處理程序”。 這個內部處理程序不與任何記錄器相關聯,並且像 StreamHandler 一樣將事件描述消息寫入 sys.stderr 的當前值(因此尊重任何可能有效的重定向)。 沒有對消息進行格式化 - 只打印裸事件描述消息。 處理程序的級別設置為 WARNING,因此此嚴重性和更高嚴重性的所有事件將是 output。

還根據日志記錄源代碼

class Logger(Filterer):
    # ...
    def callHandlers(self, record):
        # ...
        # found is the number of handlers
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)

因此,如果沒有處理程序,它將調用lastResort ,無論它是根記錄器還是子記錄器。 lastResort實際上是_StderrHandler(WARNING) ,這是:

class _StderrHandler(StreamHandler):
    """
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    """
    def __init__(self, level=NOTSET):
        """
        Initialize the handler.
        """
        Handler.__init__(self, level)

    @property
    def stream(self):
        return sys.stderr

所以你可以看到它實際上是一個帶有 WARNING 級別的 StreamHandler

暫無
暫無

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

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