測試環境為 CentOS 8 x86_64 (虛擬機)
參考文章 – https://iter01.com/43353.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 – 沒使用過.
在 Logger 物件(預設 level 為 Warning)和 Handler 物件(預設 level 為 NOTSET) 都可以設定級別(setLevel) ,當你要所有的 Handler 都記錄相同的級別時就在 Logger 物件使用 setLevel ,想要在個別 Handler 使用不同級別時就在 Handler 物件使用 setLevel.
等級如下:
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
- 範例 :
資料同時輸出到文字命令列與檔案,並使用相同的 level.[root@localhost ~]# vi logger_level.py import logging dev_logger = logging.getLogger(__name__) dev_logger.setLevel(logging.DEBUG) handler1 = logging.FileHandler('test.log') handler2 = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler1.setFormatter(formatter) handler2.setFormatter(formatter) dev_logger.addHandler(handler1) dev_logger.addHandler(handler2) dev_logger.debug('debug message') dev_logger.info('info message') dev_logger.warning('warning message') dev_logger.error('error message') dev_logger.critical('critical message')
執行結果
[root@localhost ~]# python3 logger_level.py 2022-05-30 02:24:41,911 - __main__ - DEBUG - debug message 2022-05-30 02:24:41,912 - __main__ - INFO - info message 2022-05-30 02:24:41,912 - __main__ - WARNING - warning message 2022-05-30 02:24:41,912 - __main__ - ERROR - error message 2022-05-30 02:24:41,912 - __main__ - CRITICAL - critical message
[root@localhost ~]# cat test.log 2022-05-30 02:24:41,911 - __main__ - DEBUG - debug message 2022-05-30 02:24:41,912 - __main__ - INFO - info message 2022-05-30 02:24:41,912 - __main__ - WARNING - warning message 2022-05-30 02:24:41,912 - __main__ - ERROR - error message 2022-05-30 02:24:41,912 - __main__ - CRITICAL - critical message
說明:
Logger 物件使用 setLevel 時所有的 Handler 皆記錄相同的級別.dev_logger.setLevel(logging.DEBUG)
- 範例 :
資料同時輸出到文字命令列與檔案,並使用不同的 level.[root@localhost ~]# vi handler_level.py import logging dev_logger = logging.getLogger(__name__) handler1 = logging.FileHandler('test.log') handler1.setLevel(logging.ERROR) handler2 = logging.StreamHandler() handler2.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') dev_logger.setLevel(logging.DEBUG) handler1.setFormatter(formatter) handler2.setFormatter(formatter) dev_logger.addHandler(handler1) dev_logger.addHandler(handler2) dev_logger.debug('debug message') dev_logger.info('info message') dev_logger.warning('warning message') dev_logger.error('error message') dev_logger.critical('critical message')
執行結果
[root@localhost ~]# python3 handler_level.py 2022-05-30 02:41:23,217 - __main__ - INFO - info message 2022-05-30 02:41:23,218 - __main__ - WARNING - warning message 2022-05-30 02:41:23,218 - __main__ - ERROR - error message 2022-05-30 02:41:23,218 - __main__ - CRITICAL - critical message
[root@localhost ~]# cat test.log 2022-05-30 02:35:34,305 - __main__ - ERROR - error message 2022-05-30 02:35:34,305 - __main__ - CRITICAL - critical message
說明:
透過個別 Handler 來設定不同級別,這邊還有特別設定 Logger level 為 Warning,因為我的 handler2 的 level 為 info ,但是 logger 預設為 Warning ,沒有這一行低於 Warning 的一樣不會出現.dev_logger.setLevel(logging.DEBUG) handler1.setLevel(logging.ERROR) handler2.setLevel(logging.INFO)
沒有解決問題,試試搜尋本站其他內容