Python – logging.Filter

測試環境為 CentOS 8 x86_64 (虛擬機)

參考文章 – https://iter01.com/519669.html

使用 logging 類別,有以下 6 個物件.

Logger <- Handler <- Formatter
   |        |
   <<<<<<<<<<<<<< Filter 
  1. Logger (紀錄器) – 用來執行日誌紀錄,透過 logging.getLogger(name=None) 來生成 .
  2. Handler (處理器) – 選擇日誌的輸出地方,常用的 Handler ,生成後透過 logger.addHandler(hdlr) 把 Handler 加到 Logger .
    • StreamHandler – 透過 logging.StreamHandler(stream=None) 來生成, 將資料輸出到標準輸出 sys.stdout, sys.stderr 或是 file-like object .
    • FileHandler – 透過 logging.FileHandler(filename, mode=’a’, encoding=None, delay=False, errors=None) 來生成 ,將資料儲存成檔案.
  3. Formatter (格式器) – 顯示訊息的格式, 透過 logging.Formatter(fmt=None, datefmt=None, style=’%’, validate=True, *, defaults=None)來生成, 生成後透過 Handler.setFormatter(fmt) 把 Formatter 加到 Handler .
  4. Filter (過濾器) – 用來控制訊息的輸出內容,看是要加到 logger 或是 Handler ,當你要所有的 Handler 都使用相同的 Filter 時就在 logger 物件透過 logger.addFilter(filter) 來生成 ,想要在個別 Handler 使用時就在 Handler 物件透過 handler.addFilter(filter) 來生成 .
  5. LogRecord – 產生 Logger 時自動生成.
  6. LoggerAdapter – 沒使用過.

下面來看一下 logging.Filter 的使用.

  1. 範例 :
    先來看一下沒加上 logging.Filter 的時候.

    [root@localhost ~]# vi loggingFilter1.py
    import logging
     
    logger = logging.getLogger('A.B')
    logger.setLevel(logging.DEBUG)
     
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
     
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')
    

    執行結果

    [root@localhost ~]# python3 loggingFilter1.py
    2022-05-31 15:48:36,077 - A.B - DEBUG - debug message
    2022-05-31 15:48:36,078 - A.B - INFO - info message
    2022-05-31 15:48:36,078 - A.B - WARNING - warning message
    2022-05-31 15:48:36,078 - A.B - ERROR - error message
    2022-05-31 15:48:36,078 - A.B - CRITICAL - critical message
    

    加上 logging.Filter

    [root@localhost ~]# vi loggingFilter2.py
    import logging
     
    logger = logging.getLogger('A.B')
    logger.setLevel(logging.DEBUG)
     
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    
    filter1 = logging.Filter(name='A.B.C')
    handler.addFilter(filter1)  
    
    logger.addHandler(handler)
     
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')
    

    執行結果,可以看到加上 Filter 之後,所有訊息都看不到了.

    [root@localhost ~]# python3 loggingFilter2.py
    

    說明:
    class logging.Filter(name=”)
    Returns an instance of the Filter class. If name is specified, it names a logger which, together with its children, will have its events allowed through the filter. If name is the empty string, allows every event.

    Filter 可以加上 name (就是我們透過 Formatter 的 %(name)s )來判斷是不要是顯示資料.

    filter1 = logging.Filter(name='A.B.C')
    filter1 = logging.Filter(name='A.B.C')
    handler.addFilter(filter1)  
    

    除了可以這樣使用外,我們還可以自行定義 Filter 類別 – https://benjr.tw/104359 或是 https://benjr.tw/104373

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料