測試環境為 CentOS 8 x86_64 (虛擬機)
參考文章 – https://iter01.com/519669.html
使用 logging 類別,有以下 6 個物件.
Logger <- Handler <- Formatter | | <<<<<<<<<<<<<< Filter
- Logger (紀錄器) – 用來執行日誌紀錄,透過 logging.getLogger(name=None) 來生成 .
- 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) 來生成 ,將資料儲存成檔案.
- Formatter (格式器) – 顯示訊息的格式, 透過 logging.Formatter(fmt=None, datefmt=None, style=’%’, validate=True, *, defaults=None)來生成, 生成後透過 Handler.setFormatter(fmt) 把 Formatter 加到 Handler .
- Filter (過濾器) – 用來控制訊息的輸出內容,看是要加到 logger 或是 Handler ,當你要所有的 Handler 都使用相同的 Filter 時就在 logger 物件透過 logger.addFilter(filter) 來生成 ,想要在個別 Handler 使用時就在 Handler 物件透過 handler.addFilter(filter) 來生成 .
- LogRecord – 產生 Logger 時自動生成.
- LoggerAdapter – 沒使用過.
下面來看一下 logging.Filter 的使用.
- 範例 :
先來看一下沒加上 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
沒有解決問題,試試搜尋本站其他內容