Python模塊-logging模塊(二)
logging模塊記錄日誌有四個主要類:logger,handler,formatter,filter
logger提供了應用程序可以直接使用的接口,每個程序在輸出信息之前都要獲得一個Logger
handler將(logger創建的)日誌記錄發送到合適的目的輸出,handler可以把信息輸出到控制臺,也可以把信息輸出到文件,還可以把信息發送到網絡上
formatter決定日誌記錄的最終輸出格式
filter用來過濾日誌記錄,filter函數返回布爾值,logger根據返回的布爾值決定過濾的語句
在屏幕打印日誌的同時寫入日誌文件:
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import logging class IgnoreBackupLogFilter(logging.Filter): ‘‘‘忽略帶warning的日誌‘‘‘ def filter(self, record): #固定寫法 return ‘warning‘ not in record.getMessage() #返回布爾類型 logger = logging.getLogger(‘web‘) #生成一個Logger對象,web為logger對象的名稱 logger.setLevel(logging.INFO) #設置等級,默認為warning stream_handler = logging.StreamHandler() #生成handler對象,用於屏幕上打印 file_handler = logging.FileHandler(‘web.log‘) #生成handler對象。用於生成日誌文件 #把handler對象綁定到logger logger.addHandler(stream_handler) logger.addHandler(file_handler) # logger.removeHandler(stream_handler) #刪除handler對象 # logger.removeHandler(file_handler) #生成formatter對象,用於屏幕上打印 stream_formatter = logging.Formatter(‘%(name)s - %(asctime)s - %(levelname)s - %(message)s‘) #生成formatter對象,用於日誌文件 file_formatter = logging.Formatter(‘%(name)s - %(asctime)s - %(levelno)s - %(message)s‘) #把formatter對象到handler對象 stream_handler.setFormatter(stream_formatter) file_handler.setFormatter(file_formatter) logger.addFilter(IgnoreBackupLogFilter()) #對日誌內容進行過濾 #logger.removeFilter(IgnoreBackupLogFilter()) #刪除filter對象 logger.debug(‘The Debug‘) logger.info(‘The info‘) logger.warning(‘The warning‘) logger.error(‘The error‘) logger.critical(‘The critical‘)
運行結果
日誌內容
日誌截斷
根據文件大小
如日誌文件為web.log,當web.log達到指定的大小之後,RotatingFileHandler自動把文件改名為web.log.1,如果web.log.1已經存在,會先把web.log.1重命名為web.log.2,最後重新創建web.log,繼續輸出日誌信息
handlers.RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
filename和mode兩個參數和FileHandler一樣,maxBytes為日誌文件最大的大小,如果maxBytes為0,意味著日誌文件可以無限大,就不再新建日誌文件了。backupCount為生成的最多備份日誌文件數,如果指定為3,就最多生成3個備份日誌文件,如果備份日誌文件已經生成3個了,再生成日誌文件的話,web.log.3並不會被更名,而是被刪除
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import logging from logging import handlers logger = logging.getLogger(‘web‘) logger.setLevel(logging.INFO) file_handler = handlers.RotatingFileHandler(‘web.log‘,maxBytes=5,backupCount=3) logger.addHandler(file_handler) file_formatter = logging.Formatter(‘%(name)s - %(asctime)s - %(levelno)s - %(message)s‘) file_handler.setFormatter(file_formatter) logger.debug(‘The Debug‘) logger.info(‘The info‘) logger.warning(‘The warning‘) logger.error(‘The error‘) logger.critical(‘The critical‘)
運行
生成了4個日誌文件,web.log為最新的日誌,web.log.3為最早的日誌
根據時間
間隔指定的時間自動創建新的日誌文件,重命名的過程與RotatingFileHandler類似,不過新的文件的命名方式為當前的時間
handlers.TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
filename參數和backupCount參數和RotatingFileHandler的作用一樣
when參數是一個字符串。表示時間間隔的單位,不區分大小寫。S為秒,M為分,H為小時,D為天,W為每星期(interval=0時為星期一),midnight為每天淩晨
interval為時間間隔
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import logging from logging import handlers logger = logging.getLogger(‘web‘) logger.setLevel(logging.INFO) file_handler = handlers.TimedRotatingFileHandler(‘web.log‘,when=‘s‘,interval=3,backupCount=5) logger.addHandler(file_handler) file_formatter = logging.Formatter(‘%(name)s - %(asctime)s - %(levelno)s - %(message)s‘) file_handler.setFormatter(file_formatter) logger.debug(‘The Debug‘) logger.info(‘The info‘) logger.warning(‘The warning‘) logger.error(‘The error‘) logger.critical(‘The critical‘)
每隔5秒生成一個,需要運行才生成
運行結果
等級
logger設置的等級為最高的,腳本中以此為主
handler中設置的等級級別比logger設置的等級級別低
所以handler中打印的日誌建立在logger的級別上,再考慮handler設置的等級
Python模塊-logging模塊(二)