亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python日志采集代碼詳解

 更新時(shí)間:2022年05月06日 08:58:45   作者:給你一頁(yè)白紙  
這篇文章主要介紹了Python日志采集,在實(shí)際使用python做自動(dòng)化測(cè)試過(guò)程中兩種解決思路都可以使用,且都挺方便,其中對(duì)于思路1,還可以將代碼進(jìn)行更進(jìn)一步的封裝,需要的朋友可以參考下

通常在前期調(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ò)程

    這篇文章主要為大家介紹了Pytorch搭建YoloV5目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • python中split()函數(shù)的用法詳解

    python中split()函數(shù)的用法詳解

    Python join() 方法用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串,這篇文章主要介紹了python中split()函數(shù)的用法詳解,需要的朋友可以參考下
    2023-01-01
  • Python操作Sqlite正確實(shí)現(xiàn)方法解析

    Python操作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)題

    利用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
  • 實(shí)例介紹Python中整型

    實(shí)例介紹Python中整型

    在本篇內(nèi)容中我們通過(guò)實(shí)例分享了關(guān)于Python中整型的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-02-02
  • 如何使用python傳入不確定個(gè)數(shù)參數(shù)

    如何使用python傳入不確定個(gè)數(shù)參數(shù)

    這篇文章主要介紹了如何使用python傳入不確定個(gè)數(shù)參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python 用lambda函數(shù)替換for循環(huán)的方法

    python 用lambda函數(shù)替換for循環(huán)的方法

    今天小編就為大家分享一篇python 用lambda函數(shù)替換for循環(huán)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Pyinstaller+Pipenv打包Python文件的實(shí)現(xiàn)示例

    Pyinstaller+Pipenv打包Python文件的實(shí)現(xiàn)示例

    相信大家都試過(guò)將Python文件進(jìn)行打包,本文主要介紹了Pyinstaller+Pipenv打包Python文件,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python初學(xué)者,用python實(shí)現(xiàn)基本的學(xué)生管理系統(tǒng)(python3)代碼實(shí)例

    python初學(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
  • 通過(guò)Python繪制九種二次曲面的示例詳解

    通過(guò)Python繪制九種二次曲面的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python繪制九種二次曲面,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06

最新評(píng)論