[英]What is the default setting (log handler, log level, log format) for child logger?
[英]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.