13.1 日志的定義
13.1.1 日志的定義
聽到日志這個東西可能有的人莫名其妙,第一次接觸就會覺得我們為什么要收集日志,即使要收集日志那么我們需要收集哪些日志,日志的作用是什么等等。
其實日志無論是在測試、開發中都非常重要,如果你在跑自動化時程序報錯了,但是你沒有日志你怎么去定位時程序錯誤還是你app的錯誤?或者還是其它環境因素?
在java中有log4j這日志模塊,在python里面我們使用的是logging這個模塊,這個模塊不需要你去怎么下載安裝等等,python自帶的有,你只需要拿來用就好。
13.2 日志收集實戰
13.2.1 日志三要素
假如在測試過程中我們知道了日志的重要性,這樣就可以了嗎?答案肯定是否定的,我們在收集日志的過程中我們需要明白幾個事情:
一、日志的級別
在公司員工有級別之分,這個日志也是一樣,他也有級別之分。為什么這么說呢?你總不可能把測試過程中所有的日志都收集下來吧,我管他3、7、21的都收集起來。這個肯定不行。
首先我們日志需要按照info、debug、error等級別來進行區分的。當然這個級別可以自己去設置。在一般的情況下我們普通的輸出我們直接用info類型,調試的時候用debug類型,如果預計有錯誤時那么我們就需要用error類型的日志。
二、日志的格式
為什么有日志格式呢?因為在我們調試程序或者看日志的時候我們為了更好的去閱讀,或者增加日志的可讀性,以及我們定位問題方便、快速我們需要對日志的格式進行一些優化,好比我在這個日志輸出的時候輸出時間,以及我看到這個日志的時候我知道是哪一個類出錯了呢?
三、日志位置
大家在寫程序的時候看日志可能大多數人還是通過在控制台進行查看,如果說你不小心將控制台關閉了呢?以及你集成框架后你怎么從控制台看呢?這些都不是現實的,所以在日志中我們需要有一個位置去保存我們的日志,所以在搭建框架時我們都會有一個默認的日志目錄。
13.2.2 日志收集實戰
一、日志文件配置
首先我們收集日志我們要對logging模塊進行一個配置,其實這個和log4j是一樣的,大家可以在官網或者其它地方查詢一下這個配置的基礎文件,我這里也給大家展示一個:log.conf
[loggers] keys=root,infoLogger,errorlogger [logger_root] level=DEBUG handlers=infohandler,errorhandler [logger_infoLogger] handlers=infohandler qualname=infoLogger propagate=0 [logger_errorlogger] handlers=errorhandler qualname=errorlogger propagate=0 ############################################### [handlers] keys=infohandler,errorhandler [handler_infohandler] class=StreamHandler level=INFO formatter=form02 args=(sys.stdout,) [handler_errorhandler] class=FileHandler level=ERROR formatter=form01 args=('../logs/mylog.log', 'a') ############################################### [formatters] keys=form01,form02 [formatter_form01] format=%(asctime)s %(filename)s %(levelname)s %(message)s datefmt=%Y-%m-%d %H:%M:%S [formatter_form02] format=%(asctime)s %(filename)s %(levelname)s %(message)s datefmt=%Y-%m-%d %H:%M:%S
這個配置文件每個人配置的都不一樣,但是大體功能都差不多,這個只需要根據自己的愛好去定義就行,下面我把配置定義的方法貼出來大家看一下:
1. 初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志記錄的模塊名字,后面的日志格式中的%(name)s 對應的是這里的模塊名字 2. 設置級別 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL這幾種級別,日志會記錄設置級別以上的日志 3. Handler,常用的是StreamHandler和FileHandler,windows下你可以簡單理解為一個是console和文件日志,一個打印在CMD窗口上,一個記錄在一個文件上 4. formatter,定義了最終log信息的順序,結構和內容,我喜歡用這樣的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S', %(name)s Logger的名字 %(levelname)s 文本形式的日志級別 %(message)s 用戶輸出的消息 %(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒 %(levelno)s 數字形式的日志級別 %(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有 %(filename)s 調用日志輸出函數的模塊的文件名 %(module)s 調用日志輸出函數的模塊名 %(funcName)s 調用日志輸出函數的函數名 %(lineno)d 調用日志輸出函數的語句所在的代碼行 %(created)f 當前時間,用UNIX標准的表示時間的浮 點數表示 %(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數 %(thread)d 線程ID。可能沒有 %(threadName)s 線程名。可能沒有 %(process)d 進程ID。可能沒有
其實大家只需要按照我上面的配置就好,這里需要提點的一下是,在配置文件里面你需要配置一下日志的輸出文件,如果你沒有這個文件,系統會報錯,“args=('../logs/mylog.log', 'a')” 這一句大家根據自己的情況進行更改。
當我們把所有的配置文件配置好了之后我們只需要在我們需要用到的地方去引入就好,看下面的代碼:
#coding=utf-8 import logging import logging.config #這個是配置文件的路徑 CONF_LOG = "../Config/log.conf" logging.config.fileConfig(CONF_LOG) logger = logging.getLogger() #下面就是使用日志打印日志信息 logger.info("info類型的日志") logger.error("error 的日志")
通過上面的配置以及輸出最后的結果如下圖:
通過這個圖片我們能夠看到我們有輸出的日志時間、以及類的名字、以及等級。是不是很方便?動手吧。
備注:我這里把錯誤的日志在logs文件下的mylog.log文件也進行了保存,因為我們在看線上錯誤日志時大多數只看錯誤的日志,所以只將錯誤的日志進行了保存,如果其它類型的需要保存,那么你就按照類似格式在info等配置下也把目錄配置進去即可。