Python日志采集代碼詳解
通常在前期調(diào)試代碼的時(shí)候,我們會(huì)使用print在IDE控制臺(tái)打印一些信息,判斷運(yùn)行情況。但在運(yùn)行整個(gè)自動(dòng)化測(cè)試項(xiàng)目的過(guò)程中,通過(guò)print打印信息的方式獲取運(yùn)行情況顯然行不通。
這時(shí)就需要收集日志,每次運(yùn)行后通過(guò)查看日志來(lái)獲取項(xiàng)目運(yùn)行情況。那么我們?cè)撊绾潍@取日志?
一,日志概述
1,日志作用
在項(xiàng)目開(kāi)發(fā)或測(cè)試過(guò)程中,項(xiàng)目運(yùn)行一旦出現(xiàn)問(wèn)題,記錄日志信息就顯得尤為重要。主要通過(guò)日志來(lái)定位問(wèn)題,就好比偵探人員要根據(jù)現(xiàn)場(chǎng)留下的線(xiàn)索來(lái)推斷案情。
2,日志級(jí)別
- 代碼在運(yùn)行的過(guò)程中會(huì)出現(xiàn)不同的情況,如調(diào)試信息、警告信息、報(bào)錯(cuò)等,那么采集日志時(shí)就需要對(duì)這些日志區(qū)分級(jí)別管理,這樣才能更精確地定位問(wèn)題。日志級(jí)別一般分類(lèi)如下(以嚴(yán)重程度遞增排序):
級(jí)別 | 何時(shí)使用 |
---|---|
DEBUG | 調(diào)試信息,也是最詳細(xì)的日志信息 |
INFO | 證明事情按預(yù)期工作 |
WARNING | 表明發(fā)生了一些意外,或不久的將來(lái)會(huì)發(fā)生問(wèn)題(如 磁盤(pán)滿(mǎn)了),軟件還是正常工作 |
ERROR | 由于更嚴(yán)重的問(wèn)題,軟件已經(jīng)不能執(zhí)行一些工作了 |
CRITICAL | 嚴(yán)重錯(cuò)誤,表明軟件已經(jīng)不能繼續(xù)運(yùn)行了 |
- 日志級(jí)別排序?yàn)椋篊RITICAL > ERROR > WARNING > INFO > DEBUG
日志采集時(shí)設(shè)置低級(jí)別的日志,能采集到更高級(jí)別的日志,但不能采集到更低級(jí)別的日志。
例如:設(shè)置的日志級(jí)別為info級(jí)別,就只能采集到info、warning、error、critical級(jí)別的日志,不能采集到debug級(jí)別的日志。設(shè)置的日志級(jí)別為debug級(jí)別的話(huà)則能采集到所有級(jí)別的日志。默認(rèn)設(shè)置級(jí)別為WARNING。
- 在自動(dòng)化測(cè)試項(xiàng)目中,通常在一般情況時(shí)使用info日志,預(yù)計(jì)報(bào)錯(cuò)則使用error日志。
3,日志格式
將日志格式化是為了提高日志的可閱讀性,比如:時(shí)間+模塊+行數(shù)+日志級(jí)別+日志具體信息的日志格式。如果輸出的日志信息雜亂無(wú)章,就不利于問(wèn)題的定位。如下所示就是日志格式化輸出,非常便于閱讀查看。
2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG this is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO this is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING this is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR this is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL this is critical message.
4,日志位置
通常,在一個(gè)項(xiàng)目中會(huì)有很多的日志采集點(diǎn),日志采集點(diǎn)的設(shè)置必須結(jié)合業(yè)務(wù)來(lái)確定。
比如在執(zhí)行修改登錄密碼用例前插入“開(kāi)始執(zhí)行修改登錄密碼用例...”的日志信息。再比如在登錄代碼執(zhí)行前可以插入“準(zhǔn)備登錄...”日志信息。
如果在登錄完成后,再設(shè)置登錄的提示日志就會(huì)給人造成誤解,無(wú)法判斷到底是登錄之前的問(wèn)題還是登錄之后的問(wèn)題,因此日志采集點(diǎn)的位置很重要。
二,logging模塊
1,簡(jiǎn)介
logging為python自帶的日志模塊,提供了通用的日志系統(tǒng),包括不同的日志級(jí)別。logging可使用不同的方式記錄日志,如使用文件,HTTP GET/POST,SMTP,Socket等方式記錄。通常情況下,我們使用文件記錄日志信息,文件格式一般為.txt或.log文件。
2,文檔
詳細(xì)內(nèi)容可查看logging模塊官方文檔,使用時(shí)需要導(dǎo)入:
import logging
三,logging第一種使用方法:簡(jiǎn)單配置使用
1,使用方法
logging.basicConfig(**kwargs)
2,basicConfig()部分參數(shù)說(shuō)明
filename指定日志名稱(chēng)或完整路徑,如:E:/app-ui-autotest/log/log.txt
filemode指定打開(kāi)文件的模式(如果文件打開(kāi)模式未指定,則默認(rèn)為'a')
常見(jiàn)的文件讀寫(xiě)方式:
- w 以寫(xiě)的方式打開(kāi)
- W 清空后寫(xiě)入(文件已存在)
- r 以讀的方式打開(kāi)
- a 以追加模式打開(kāi)(即在文件原有的數(shù)據(jù)后面添加)
format指定日志輸出格式
level將根記錄器級(jí)別設(shè)置為指定級(jí)別
3,示例1:日志打印至控制臺(tái)
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 import logging logging.basicConfig(filename='./log.txt', level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') logging.error('This is error message') logging.critical('This is critical message')
控制臺(tái)輸出結(jié)果:
2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG This is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.
4,示例2:日志保存至文件
logging.basicConfig(filename='log.txt', level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') logging.error('This is error message') logging.critical('This is critical message')
輸出格式:
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.
注意:
- 相較于控制臺(tái)打印日志,文件保存日志的區(qū)別在于basicConfig()方法中加入了filename參數(shù)(即文件的完整路徑)。
- 保存日志至文件示例中,因?yàn)閰?shù)level=logging.INFO,所以DEBUG級(jí)別的日志未輸出
四,logging的第二種使用方式:日志流處理流程
1,logging四大組件介紹
logging模塊包括Logger,Handler,F(xiàn)ilter,F(xiàn)ormatter四個(gè)部分。
- Logger 記錄器,用于設(shè)置日志采集。
- Handler 處理器,將日志記錄發(fā)送至合適的路徑。
- Filter 過(guò)濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。
- Formatter 格式化器,指明了最終輸出中日志的格式。
2,Logger 記錄器
使用日志流采集日志時(shí),須先創(chuàng)建Logger實(shí)例,即創(chuàng)建一個(gè)記錄器(如果沒(méi)有顯式的進(jìn)行創(chuàng)建,則默認(rèn)創(chuàng)建一個(gè)root logger,并應(yīng)用默認(rèn)的日志級(jí)別WARNING,Handler和Formatter),然后做以下三件事:
- 為程序提供記錄日志的接口
- 根據(jù)過(guò)濾器設(shè)置的級(jí)別對(duì)日志進(jìn)行過(guò)濾
- 將過(guò)濾后的日志根據(jù)級(jí)別分發(fā)給不同handler
3,Handler 處理器
Handler處理器作用是,將日志記錄發(fā)送至合適的路徑。如發(fā)送至文件或控制臺(tái),此時(shí)需要使用兩個(gè)處理器,用于輸出控制臺(tái)的處理器,另一個(gè)是用于輸出文件的處理器。通過(guò) addHandler() 方法添加處理器 。常用的處理器類(lèi)型有以下兩種:
3.1,StreamHandler
- 將日志信息發(fā)送至sys.stdout、sys.stderr或任何類(lèi)似文件流對(duì)象,如在Pycharm IDE上顯示的日志信息。
- 構(gòu)造函數(shù)為:StreamHandler(strm)。參數(shù)strm是一個(gè)文件對(duì)象,默認(rèn)是sys.stderr。
3.2,F(xiàn)ileHandler
- 將日志記錄輸出發(fā)送至磁盤(pán)文件。 它繼承了StreamHandler的輸出功能,不過(guò)FileHandler會(huì)幫你打開(kāi)這個(gè)文件,用于向一個(gè)文件輸出日志信息。
- 構(gòu)造函數(shù)為:FileHandler(filename, mode)。參數(shù)filename為文件名(文件完整路徑),參數(shù)mode為文件打開(kāi)方式,默認(rèn)為'a'即在文末追加。
自動(dòng)化測(cè)試使用這兩種類(lèi)型就夠了,其他還有RotatingFileHandler、TimedRotatingFileHandler、NullHandler等處理器,有興趣可以查找資料了解。
4,F(xiàn)ilter 過(guò)濾器
顧名思義是用于過(guò)濾,Handlers 與 Loggers 使用 Filters 可以完成比級(jí)別更復(fù)雜的過(guò)濾。不多做介紹,有興趣可以查找資料了解。
5,F(xiàn)ormatter 格式化器
Formatter用于設(shè)置日志的格式與內(nèi)容,默認(rèn)的時(shí)間格式為%Y-%m-%d %H:%M:%S,更多格式如下:
格式 | 描述 |
---|---|
%(levelno)s | 打印日志級(jí)別的數(shù)值 |
%(levelname)s | 打印日志級(jí)別的名稱(chēng) |
%(pathname)s | 打印當(dāng)前執(zhí)行程序的路徑 |
%(filename)s | 打印當(dāng)前執(zhí)行程序的名稱(chēng) |
%(funcName)s | 打印日志的當(dāng)前函數(shù) |
%(lineno)d | 打印日志的當(dāng)前行號(hào) |
%(asctime)s | 打印日志的時(shí)間 |
%(thread)d | 打印線(xiàn)程ID |
%(threadName)s | 打印線(xiàn)程名稱(chēng) |
%(process)d | 打印進(jìn)程ID |
%(message)s | 打印日志信息 |
6,使用示例:將日志輸出至控制臺(tái),同時(shí)保存至文件
根據(jù)logging的模塊化來(lái)編寫(xiě)代碼,思路參考如下。
目錄結(jié)構(gòu)
logging_test.py
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 import logging # 第一步,創(chuàng)建日志記錄器 # 1,創(chuàng)建一個(gè)日志記錄器logger logger = logging.getLogger() # 2,設(shè)置日志記錄器的日志級(jí)別,這里的日志級(jí)別是日志記錄器能記錄到的最低級(jí)別,區(qū)別于后面Handler里setLevel的日志級(jí)別 logger.setLevel(logging.DEBUG) # 第二步,創(chuàng)建日志處理器Handler。這里創(chuàng)建一個(gè)Handler,用于將日志寫(xiě)入文件 # 3,創(chuàng)建一個(gè)Handler,用于寫(xiě)入日志文件,日志文件的路徑自行定義 logFile = './log.txt' fh = logging.FileHandler(logFile, mode='a', encoding='utf-8') # 4,設(shè)置保存至文件的日志等級(jí) fh.setLevel(logging.INFO) # 第三步,定義Handler的輸出格式 # 5,日志輸出格式定義如下 format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') # 6,設(shè)置 寫(xiě)入日志文件的Handler 的日志格式 fh.setFormatter(format) # 第四步,將Handler添加至日志記錄器logger里 logger.addHandler(fh) # 同樣的,創(chuàng)建一個(gè)Handler用于控制臺(tái)輸出日志 ch = logging.StreamHandler() ch.setLevel(logging.INFO) ch.setFormatter(format) logger.addHandler(ch) # 輸出日志 logger.info("This is info message") logger.warning("This is warning message") logger.error("This is error message") logger.critical("This is critical message")
Pycharm運(yùn)行l(wèi)ogging_test.py模塊,log.txt以及Pycharm控制臺(tái)得到如下結(jié)果:
2020-10-07 15:54:04,752 test.py[line:3] INFO This is info message
2020-10-07 15:54:04,752 test.py[line:4] WARNING This is warning message
2020-10-07 15:54:04,752 test.py[line:5] ERROR This is error message
2020-10-07 15:54:04,752 test.py[line:6] CRITICAL This is critical message
五,logging 實(shí)戰(zhàn)
1,測(cè)試場(chǎng)景
給登錄今日頭條app的操作添加日志采集。
2,簡(jiǎn)單配置代碼示例
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 import logging from appium import webdriver logging.basicConfig(filename='./testLog.log', level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') def android_driver(): desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "PCT_AL10", "appPackage": "com.ss.android.article.news", "appActivity": ".activity.MainActivity", "unicodeKeyboard": True, "resetKeyboard": True, "noReset": True, } logging.info("啟動(dòng)今日頭條APP...") driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) return driver def login_opera(driver): '''登錄今日頭條操作''' logging.info("開(kāi)始登陸今日頭條APP...") try: driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點(diǎn)擊【我知道了】 driver.find_element_by_id("android:id/button1").click() # 點(diǎn)擊權(quán)限管理-確定按鈕 driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點(diǎn)擊未登錄 driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁(yè)點(diǎn)擊登錄按鈕 driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁(yè)點(diǎn)擊“。。?!? driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄 driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236") # 輸入賬號(hào) driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172") # 輸入密碼 driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點(diǎn)擊登錄 except Exception as e: logging.error("登錄錯(cuò)誤,原因?yàn)椋簕}".format(e)) else: logging.info("登陸成功...") driver = android_driver() login_opera(driver)
登錄成功則日志輸出如下:
2020-09-30 18:20:05,119 logging_test.py[line:21] INFO 啟動(dòng)今日頭條APP...
2020-09-30 18:20:10,119 logging_test.py[line:27] INFO 開(kāi)始登陸今日頭條APP...
2020-09-30 18:21:07,120 logging_test.py[line:41] INFO 登陸成功...
3,拋出問(wèn)題
上面示例代碼成功地獲取了日志信息,但這種寫(xiě)法只能作用于當(dāng)前模塊。而一個(gè)自動(dòng)化測(cè)試項(xiàng)目往往有多個(gè)模塊,如果在每個(gè)需要獲取日志的模塊都使用這樣的方式,顯然是不方便維護(hù)的。那么我們需要怎么解決呢?
4,解決思路
使用日志流處理流程。提供以下兩種思路:
思路1:使用python代碼實(shí)現(xiàn)日志配置。先創(chuàng)建日志記錄器,并設(shè)置好Handler與日志格式,如上面的logging_test.py模塊構(gòu)造logger,其他模塊采集日志時(shí)直接調(diào)用。
思路2:將日志的格式、輸出路徑等參數(shù)抽離出來(lái)放置在專(zhuān)門(mén)的配置文件里,如logging.conf,使用專(zhuān)門(mén)的模塊處理,使用時(shí)直接在模塊調(diào)用即可。
5,思路1:使用python代碼實(shí)現(xiàn)日志配置示例
目錄結(jié)構(gòu)
test.py中需要采集日志時(shí),從logging_test.py導(dǎo)入logger即可。也可以將logging_test.py里的代碼進(jìn)行進(jìn)一步的封裝,再調(diào)用,這里僅僅只是示例。
logging_test.py
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 import logging # 創(chuàng)建日志記錄器 logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 設(shè)置日志輸出格式 format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') # 創(chuàng)建一個(gè)Handler用于將日志寫(xiě)入文件 logFile = './log.txt' fh = logging.FileHandler(logFile, mode='a', encoding='utf-8') fh.setLevel(logging.INFO) fh.setFormatter(format) logger.addHandler(fh) # 同樣的,創(chuàng)建一個(gè)Handler用于控制臺(tái)輸出日志 ch = logging.StreamHandler() ch.setLevel(logging.INFO) ch.setFormatter(format) logger.addHandler(ch)
test.py
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 from appium import webdriver from log.logging_test import logger def android_driver(): desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "PCT_AL10", "appPackage": "com.ss.android.article.news", "appActivity": ".activity.MainActivity", "unicodeKeyboard": True, "resetKeyboard": True, "noReset": True, } logger.info("啟動(dòng)今日頭條APP...") driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) return driver def login_opera(driver): '''登錄今日頭條操作''' logger.info("開(kāi)始登陸今日頭條APP...") try: driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點(diǎn)擊【我知道了】 driver.find_element_by_id("android:id/button1").click() # 點(diǎn)擊權(quán)限管理-確定按鈕 driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點(diǎn)擊未登錄 driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁(yè)點(diǎn)擊登錄按鈕 driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁(yè)點(diǎn)擊“。。?!? driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄 driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236") # 輸入賬號(hào) driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172") # 輸入密碼 driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點(diǎn)擊登錄 except Exception as e: logger.error("登錄錯(cuò)誤,原因?yàn)椋簕}".format(e)) else: logger.info("登陸成功...") driver = android_driver() login_opera(driver)
運(yùn)行test.py,結(jié)果如下:
2020-10-07 18:45:05,119 logging_test.py[line:21] INFO 啟動(dòng)今日頭條APP...
2020-10-07 18:45:11,119 logging_test.py[line:27] INFO 開(kāi)始登陸今日頭條APP...
2020-10-07 18:45:20,120 logging_test.py[line:41] INFO 登陸成功...
6,思路2:日志格式配置示例
6.1,logger.conf文件
[loggers] # loggers日志器對(duì)象列表,必須包含 keys=root, exampleLogger # 一定要包含root這個(gè)值,當(dāng)使用無(wú)參函數(shù)logging.getLogger()時(shí),默認(rèn)返回root這個(gè)logger,其他自定義logger可以通過(guò)logging.getLogger("exampleLogger")方式進(jìn)行調(diào)用 [handlers] # handlers處理器對(duì)象列表,必須包含 keys=consoleHandler, fileHandler # 定義聲明handlers信息 [formatters] # formatters格式對(duì)象列表,必須包含 keys=form01,form02 [logger_root] # 對(duì)loggers中聲明的logger進(jìn)行逐個(gè)配置,且要一一對(duì)應(yīng),在所有的logger中,必須制定lebel和handlers這兩個(gè)選項(xiàng)。對(duì)于非roothandler,還需要添加一些額外的option,如qualname、propagate等。handlers可以指定多個(gè),中間用逗號(hào)隔開(kāi),比如handlers=fileHandler,consoleHandler,同時(shí)制定使用控制臺(tái)和文件輸出日志 level=DEBUG handlers=consoleHandler, fileHandler [logger_exampleLogger] # 配置日志處理器exampleLogger:設(shè)置日志級(jí)別、日志輸出指定的處理器配置文件,如consoleHandler,fileHandler level=DEBUG handlers=consoleHandler, fileHandler qualname=exampleLogger # qualname 表示它在logger層級(jí)中的名字,在應(yīng)用代碼中通過(guò)這個(gè)名字制定所使用的handler propagate=0 # 可選項(xiàng),其默認(rèn)是為1,表示消息將會(huì)傳遞給高層次logger的handler [handler_consoleHandler] # 日志處理器consoleHandler的配置文件 class=StreamHandler # 定控制臺(tái)輸出。將日志消息發(fā)送到輸出到Stream,如std.out, std.err或任何file-like對(duì)象 level=DEBUG # 日志級(jí)別 formatter=form01 # 輸出格式 args=(sys.stdout,) [handler_fileHandler] # 日志處理器fileHandler的配置文件 class=FileHandler # 將日志輸出至磁盤(pán)文件 level=DEBUG # 日志級(jí)別 formatter=form02 # 輸出格式 args=('./log.txt', 'a', 'UTF-8') # 參數(shù)如未設(shè)置絕對(duì)路徑,則默認(rèn)生成在執(zhí)行文件log.py的工作目錄。指定日志文件的打開(kāi)模式,默認(rèn)為'a' [formatter_form01] # 格式配置1 format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s [formatter_form02] # 格式配置2 format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
注意:
- 為了說(shuō)明配置結(jié)構(gòu),這里的配置文件 logger.conf 里加了中文注釋?zhuān)瑢?shí)際使用時(shí)需要將注釋去掉或改寫(xiě)成英文注釋?zhuān)駝t會(huì)報(bào)編碼錯(cuò)誤。
- 配置文件中包含三大主要模塊:loggers,handlers,formatters。這三個(gè)主要模塊包含的內(nèi)容都是通過(guò)keys進(jìn)行指定,然后通過(guò)logger_key、handler_key、formatter_key對(duì)里面的key進(jìn)行具體的設(shè)置。
- 配置handlers中的handler_consoleHandler的參數(shù):指定日志輸出到控制臺(tái)、級(jí)別、輸出格式、參數(shù)。
- 配置handlers中的handler_fileHandlers的參數(shù):指定將日志輸出至磁盤(pán)文件、設(shè)置日志級(jí)別、輸出格式、參數(shù)等。
- 配置日志輸出格式formatter_xxx,可配置多個(gè),如:form01,form02。
6.2,讀取配置文件,創(chuàng)建日志記錄器logger
baseLog.py
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 import logging.config CON_LOG='./logger.conf' # 配置文件路徑 logging.config.fileConfig(CON_LOG) # '讀取日志配置文件' logger = logging.getLogger('exampleLogger') # 創(chuàng)建一個(gè)日志器logger
6.3,調(diào)用示例
目錄結(jié)構(gòu)如下
test.py
# -*- coding:utf-8 -*- # @author: 給你一頁(yè)白紙 from appium import webdriver from log.baseLog import logger def android_driver(): desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "PCT_AL10", "appPackage": "com.ss.android.article.news", "appActivity": ".activity.MainActivity", "unicodeKeyboard": True, "resetKeyboard": True, "noReset": True, } logger.info("啟動(dòng)今日頭條APP...") driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) return driver def login_opera(driver): '''登錄今日頭條操作''' logger.info("開(kāi)始登陸今日頭條APP...") try: driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點(diǎn)擊【我知道了】 driver.find_element_by_id("android:id/button1").click() # 點(diǎn)擊權(quán)限管理-確定按鈕 driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點(diǎn)擊未登錄 driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁(yè)點(diǎn)擊登錄按鈕 driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁(yè)點(diǎn)擊“。。?!? driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄 driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236") # 輸入賬號(hào) driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172") # 輸入密碼 driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點(diǎn)擊登錄 except Exception as e: logger.error("登錄錯(cuò)誤,原因?yàn)椋簕}".format(e)) else: logger.info("登陸成功...") driver = android_driver() login_opera(driver)
控制臺(tái)、log.txt輸出結(jié)果如下:
2020-10-07 19:30:35,119 logging_test.py[line:21] INFO 啟動(dòng)今日頭條APP...
2020-10-07 19:30:40,119 logging_test.py[line:27] INFO 開(kāi)始登陸今日頭條APP...
2020-10-07 19:31:12,120 logging_test.py[line:41] INFO 登陸成功...
7,總結(jié)
在實(shí)際使用python做自動(dòng)化測(cè)試過(guò)程中兩種解決思路都可以使用,且都挺方便。其中對(duì)于思路1,還可以將代碼進(jìn)行更進(jìn)一步的封裝。
到此這篇關(guān)于Python日志采集(詳細(xì))的文章就介紹到這了,更多相關(guān)Python日志采集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過(guò)程
這篇文章主要為大家介紹了Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Python操作Sqlite正確實(shí)現(xiàn)方法解析
我們今天將會(huì)在這篇文章中分步驟為大家詳細(xì)介紹一下有關(guān)Python操作Sqlite的相關(guān)應(yīng)用方式,希望大家可以從中獲得一些幫助2020-02-02利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴(lài)的問(wèn)題
這篇文章主要給大家介紹了關(guān)于利用python解決mysql視圖導(dǎo)入導(dǎo)出依賴(lài)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12如何使用python傳入不確定個(gè)數(shù)參數(shù)
這篇文章主要介紹了如何使用python傳入不確定個(gè)數(shù)參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python 用lambda函數(shù)替換for循環(huán)的方法
今天小編就為大家分享一篇python 用lambda函數(shù)替換for循環(huán)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Pyinstaller+Pipenv打包Python文件的實(shí)現(xiàn)示例
相信大家都試過(guò)將Python文件進(jìn)行打包,本文主要介紹了Pyinstaller+Pipenv打包Python文件,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03python初學(xué)者,用python實(shí)現(xiàn)基本的學(xué)生管理系統(tǒng)(python3)代碼實(shí)例
這篇文章主要介紹了用python實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04