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 不會同時使用。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。