1. 程式人生 > 程式設計 >Python logging模組handlers用法詳解

Python logging模組handlers用法詳解

一、handlers是什麼?

logging模組中包含的類

用來自定義日誌物件的規則(比如:設定日誌輸出格式、等級等)

常用3個子類:StreamHandler、FileHandler、TimedRotatingFileHandler

二、handlers基礎應用

2.1 StreamHandler 控制檯輸出日誌

import logging

#建立一個logger日誌物件
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #設定預設的日誌級別

#建立日誌格式物件
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#建立StreamHandler物件
sh = logging.StreamHandler()
#StreamHandler物件自定義日誌級別
sh.setLevel(logging.DEBUG)
#StreamHandler物件自定義日誌格式
sh.setFormatter(formatter)

logger.addHandler(sh)  #logger日誌物件載入StreamHandler物件
#日誌輸出
logger.info('newdream')

上面程式碼執行後,會在控制檯輸出日誌資訊。

2.2 FileHandler 日誌輸出到檔案

import logging

#建立一個logger日誌物件
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #設定預設的日誌級別

#建立日誌格式物件
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#建立FileHandler物件
fh = logging.FileHandler('test.log')
#FileHandler物件自定義日誌級別
fh.setLevel(logging.DEBUG)
#FileHandler物件自定義日誌格式
fh.setFormatter(formatter)

logger.addHandler(fh)  #logger日誌物件載入FileHandler物件
#日誌輸出
logger.info('newdream')

上面程式碼執行後,控制檯不會輸出日誌資訊,而會在當前資料夾新建一個test.log日誌檔案進行日誌記錄。

2.3 TimedRotatingFileHandler 日誌分割

import logging
from logging import handlers

#建立一個logger日誌物件
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #設定預設的日誌級別

#建立日誌格式物件
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#建立TimedRotatingFileHandler物件
rh = handlers.TimedRotatingFileHandler("test.log",when='S',interval=1,backupCount=5)
#TimedRotatingFileHandler物件自定義日誌級別
rh.setLevel(logging.DEBUG)
#TimedRotatingFileHandler物件自定義日誌級別
rh.suffix = "%Y_%m_%d_%H_%M_%S.log"
#TimedRotatingFileHandler物件自定義日誌格式
rh.setFormatter(formatter)

logger.addHandler(rh)  #logger日誌物件載入TimedRotatingFileHandler物件
#日誌輸出
logger.info('newdream')

上面程式碼執行後,控制檯不會輸出日誌資訊,而會在當前資料夾新建一個 test_年_月_日_時_分_秒.log 日誌檔案進行日誌記錄。

在使用TimedRotatingFileHandler建立物件時,它的建構函式定義如下:

  • TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
  • filename:是輸出日誌檔名的字首,比如log/myapp.log
  • when:按什麼日期格式切分,接收指定字串引數,接收的值如下:

“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval 是指等待多少個單位when的時間後,Logger會自動重建檔案,這個檔案的建立取決於filename+suffix,若這個檔案跟之前的檔案有重名,則會自動覆蓋掉以前的檔案,所以有些情況suffix要定義不能因為when而重複。
backupCount 是保留日誌個數。預設的0是不會自動刪除掉日誌。若設為5,則在檔案的建立過程中庫會判斷是否有超過這個5,若超過,則會從最先建立的開始刪除。

三、小結

以上的日誌例項為了讓讀者更清晰的操作和理解,分開程式碼單獨實現

在 2.3 中 如果想實現看是否達到5個日誌就刪除的效果,可以把日誌用迴圈輸出,如下:

while True:
logger.info('newdream')

三種handlers日誌可以共同使用,都是獨立的handler物件,但一般 FileHandler 和 TimedRotatingFileHandler 不會同時使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。