簡體   English   中英

記錄器的“setLevel”和連接到記錄器的處理程序的“setLevel”之間的區別

[英]The difference between 'setLevel' of a logger and 'setLevel' of a handler connected to the logger

我試圖掌握logger.setLevel的影響和handler.setLevel的影響之間的區別,其中loggerhandler的創建方式如下:

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.

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