前言
在自動(dòng)化測試中,為了定位問題,調(diào)試框架代碼,需要使用日志模塊,今天我們重點(diǎn)講解Python中的logging模塊,在學(xué)習(xí)使用logging模塊前,我們先要了解logging模塊的四大天王:logger、handler、filter、formatter
一.logging模塊的四大組件
logger:日志器,提供程序可使用的接口
handler:處理器,用于寫入日志文件并輸出到指定位置,如文件、控制臺(tái)或網(wǎng)絡(luò)等
filter:過濾器,用于輸出符合指定條件的日志記錄
formatter:格式器,決定日志記錄的輸出格式
二.如何使用logging模塊---基本用法
1.創(chuàng)建logger對象,返回一個(gè)日志器
logger = logging.getlogger()
2.設(shè)置日志等級(jí)
logger.setLevel("DEBUG") #設(shè)置日志等級(jí)為debug
常見的日志級(jí)別有:DEBUG、INFO、WARNING、ERROR、CRITICAL,具體用法如下:
DEBUG:最低級(jí)別,追蹤問題時(shí)使用
INFO:記錄程序中一般事件的信息,或確認(rèn)一切工作正常
WARNING:記錄信息,用于警告
ERROR:用于記錄程序報(bào)錯(cuò)信息
CRITICAL:最高級(jí)別,記錄可能導(dǎo)致程序崩潰的錯(cuò)誤
3.創(chuàng)建一個(gè)處理器對象
fh = logging.FileHandler(filename="bbb.log", mode='a', encoding="utf-8", delay=False) #創(chuàng)建一個(gè)文件處理器,日志輸入文件,需要指定文件名稱,寫入的模式,編碼格式等
4.創(chuàng)建一個(gè)格式器對象
fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]") #一般格式器中要定義好日志產(chǎn)生時(shí)間,日志級(jí)別,產(chǎn)生日志的模塊全路徑,模塊的哪一行,具體的日志信息等
5.為處理器添加格式
fh.setFormatter(fmt=fmt),將第4步中生成的格式器給第3步生成的處理器“吞吃”
6.為日志器添加處理方式
logger.addHandler(fh),將設(shè)置格式后的處理器對象給日志器“吞吃”,使日志器有處理日志的能力
7.調(diào)用日志器對象,生成日志
logger.debug("這是一個(gè)debug錯(cuò)誤")
8.源碼如下:
import logging #導(dǎo)入日志模塊
logger = logging.getLogger() #創(chuàng)建日志器 logger.setLevel(logging.DEBUG) #設(shè)置日志的打印級(jí)別 fh = logging.FileHandler(filename="kkk.log",mode='a',encoding="utf-8") #創(chuàng)建日志處理器,用文件存放日志 sh = logging.StreamHandler()#創(chuàng)建日志處理器,在控制臺(tái)打印 #創(chuàng)建格式器,指定日志的打印格式 fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(filename)s]-[Line:%(lineno)d]-[Msg:%(message)s]") #給處理器設(shè)置格式 fh.setFormatter(fmt=fmt) sh.setFormatter(fmt=fmt) #給日志器添加處理器 logger.addHandler(fh) logger.addHandler(sh) #調(diào)用日志器 logger.debug("ajffasfdsas")
三.優(yōu)化
上面的日志的基本用法,沒有做封裝,實(shí)際工作中使用不方便,我們接下來將其進(jìn)行封裝,方便需要使用時(shí),進(jìn)行調(diào)用,同時(shí)將具體包括將日志按日期分別存放到不同的文件,日志名稱以時(shí)間命名;具體方法如下:???????
import logging,os,time
class Logging():
def make_log_dir(self,dirname='logs'): #創(chuàng)建存放日志的目錄,并返回目錄的路徑 now_dir = os.path.dirname(__file__) father_path = os.path.split(now_dir)[0] path = os.path.join(father_path,dirname) path = os.path.normpath(path) if not os.path.exists(path): os.mkdir(path) return path
def get_log_filename(self):#創(chuàng)建日志文件的文件名格式,便于區(qū)分每天的日志 filename = "{}.log".format(time.strftime("%Y-%m-%d",time.localtime())) filename = os.path.join(self.make_log_dir(),filename) filename = os.path.normpath(filename) return filename
def log(self,level='DEBUG'):#生成日志的主方法,傳入對那些級(jí)別及以上的日志進(jìn)行處理 logger = logging.getLogger()#創(chuàng)建日志器 levle = getattr(logging,level) #獲取日志模塊的的級(jí)別對象屬性 logger.setLevel(level)#設(shè)置日志級(jí)別 if not logger.handlers: #作用,防止重新生成處理器 sh = logging.StreamHandler()#創(chuàng)建控制臺(tái)日志處理器 fh = logging.FileHandler(filename=self.get_log_filename(),mode='a',encoding="utf-8")#創(chuàng)建日志文件處理器 #創(chuàng)建格式器 fmt = logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-Line:%(lineno)d-Message:%(message)s") #給處理器添加格式 sh.setFormatter(fmt=fmt) fh.setFormatter(fmt=fmt) #給日志器添加處理器,過濾器一般在工作中用的比較少,如果需要精確過濾,可以使用過濾器 logger.addHandler(sh) logger.addHandler(fh) return logger #返回日志器
if __name__ == '__main__': logger = Logging().log(level='DEBUG') #調(diào)用封裝的日志方法,生成處理后的日志器 logger.debug("1111111111111111111111") #使用日志器生成日志 logger.info("222222222222222222222222") logger.error("附件為IP飛機(jī)外婆家二分IP文件放") logger.warning("3333333333333333333333333333") logger.critical("44444444444444444444444444")
這些資料,對于做【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術(shù)行業(yè),一定要提升技術(shù)功底。希望對大家有所幫助…..
|