1. 程式人生 > >Python模塊-logging模塊(二)

Python模塊-logging模塊(二)

文件 lte ctime 自動 ignore ror 小時 屏幕 mes

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模塊(二)