[英]The difference between 'setLevel' of a logger and 'setLevel' of a handler connected to the logger
我試圖掌握logger.setLevel
的影響和handler.setLevel
的影響之間的區別,其中logger
和handler
的創建方式如下:
import logging
def getLogger(name, loggerLevel, handlerLevel):
formatter = logging.Formatter('%(message)s')
handler = logging.StreamHandler()
handler.setLevel(handlerLevel)
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(loggerLevel)
logger.addHandler(handler)
return logger
請注意, handler
連接到logger
。
以下是官方文檔關於setLevel
的說明:
將此記錄器的閾值設置為
level
。 低於level
的日志消息將被忽略; 具有嚴重level
或更高級別的日志消息將由為該記錄器提供服務的任何一個或多個處理程序發出,除非處理程序的level
已設置為比level
。
我沒有完全理解這一點,所以我實現了以下腳本來測試所有可能的組合:
for loggerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
for handlerLevel in ['DEBUG', 'INFO', 'WARNING', 'ERROR']:
name = loggerLevel + '_' + handlerLevel
print('{}:'.format(name))
logger = getLogger(name,eval('logging.'+loggerLevel),eval('logging.'+handlerLevel))
logger.debug (' debug ')
logger.info (' info ')
logger.warning(' warning')
logger.error (' error ')
輸出(見下文)證明了一件事 - 兩者中的較高級別是確定行動過程的一個,無論哪個實體設置為該級別。
所以我的問題是 - 為什么我們需要不止一個級別開始?
DEBUG_DEBUG:
debug
info
warning
error
DEBUG_INFO:
info
warning
error
DEBUG_WARNING:
warning
error
DEBUG_ERROR:
error
INFO_DEBUG:
info
warning
error
INFO_INFO:
info
warning
error
INFO_WARNING:
warning
error
INFO_ERROR:
error
WARNING_DEBUG:
warning
error
WARNING_INFO:
warning
error
WARNING_WARNING:
warning
error
WARNING_ERROR:
error
ERROR_DEBUG:
error
ERROR_INFO:
error
ERROR_WARNING:
error
ERROR_ERROR:
error
您可以將多個處理程序附加到記錄器,並且記錄器級別在層次結構中傳播消息時很重要。
使用多個處理程序可以讓您將不同的嚴重級別指向不同的輸出。 您可以將WARNING
消息放入控制台,將INFO
和更好的消息放入系統日志,將DEBUG
消息放入特定於應用程序的日志文件。 這就是在處理程序上設置日志級別的目的,以配置每個處理程序將獨立處理的消息。
記錄器級別在層次結構中很重要; 所有記錄器都是根記錄器的子級,您可以使用.
名稱中的點。 然后,您可以選擇哪些記錄器產生什么級別的輸出; 設置更嚴格的日志級別意味着記錄器不會處理消息(包括不將其交給父記錄器)。
例如,許多第三方庫會產生不同級別的日志輸出。 因此,對於特定應用程序,查看urllib3
庫生成的ERROR
級別消息可能會很有幫助,但對於 SQLAlchemy,您只想查看WARNING
消息。 您只需使用getLogger(name_of_library)
調用為這些庫記錄器配置級別,以阻止它們將較低級別的消息傳播到處理程序通常所在的根記錄器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.