• Appium-日志收集logging


    日志级别

    脚本运行会有很多的情况,比如调试信息、报错异常信息等。日志要根据这些不同的情况来继续分级管理,不然对于排查问题的筛选会有比较大的干扰。 。日志一般定位的级别如下:

     

     

    级别

    何时使用

    DEBUG

    调试信息,也是最详细的日志信息。

    INFO

    证明事情按预期工作。

    WARNING

    表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。

    ERROR

    由于更严重的问题,软件已不能执行一些功能了。

    CRITICAL

    严重错误,表明软件已不能继续运行了。

    首先我们日志需要按照info、debug、error等级别来进行区分的。当然这个级别可以自己去设置。在一般的情况下我们普通的输出我们直接用info类型,调试的时候用debug类型,如果预计有错误时那么我们就需要用error类型的日志,一般情况去info级别最为合适。

    日志格式

    日志格式化是为了提高日志的可阅读性,比如:时间+模块+行数+日志具体信息 的内容格式。如果日志信息杂乱无章的全部输出来,这样也不利于定位问题。如下所示就是日志格式化输出,非常便于阅读查看。

    2019-08-14 22:02:35,633 backup.py[line:18] INFO ============test backup================

    2019-08-14 22:02:39,253 backup.py[line:20] INFO click backup button

    2019-08-14 22:02:54,025 backup.py[line:23] INFO click next button

    2019-08-14 22:03:09,280 common_fun.py[line:83] INFO Start send Email..

    2019-08-14 22:03:11,840 common_fun.py[line:91] INFO Send Email finish!

    2019-08-14 22:03:13,305 common_fun.py[line:168] INFO get backup screenshot

    2019-08-14 23:36:00,238 backup.py[line:17] INFO ============test backup================

    2019-08-14 23:36:04,530 backup.py[line:19] INFO click backup button

    2019-08-14 23:37:20,107 backup.py[line:17] INFO ============test

    日志位置

    一个项目中会有很多的日志采集点,而日志采集点必须结合业务属性来设置。比如在登录代码执行前可以插入“准备登录..”日志信息,如果登录完成之后,再设置登录的提示日志就会给人造成误解,无法判断到底是登录之前的问题还是登录之后的问题,因此日志采集点的位置很重要。

     

    logging模块

    简介

    Python的logging模块提供了通用的日志系统,这个模块提供不同的日志级别,并可以采用不同的方式记录日志

     

    #导入logging模块

    import logging

     

    logging构成

    logging模块包括logger,Handler,Filter,Formatter四个部分。

    • Logger 记录器,用于设置日志采集。
    • Handler 处理器,将日志记录发送至合适的路径。
    • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
    • Formatter 格式化器,指明了最终输出中日志的格式。

    Logger 记录器

    Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical;使用之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。

    方法:basicConfig(**kwargs) 为日志记录系统做基本配置。
    部分参数

    filename 指定日志文件名称

    filemode 指定打开文件的模式,如果指定了filename(如果文件模式未指定,则默认为'a)

    Tips:文件读写模式

    • w 以写方式打开,
    • W 文件若存在,首先要清空,然后(重新)创建
    • a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
    • r+ 以读写模式打开
    • w+ 以读写模式打开 (参见 w )
    • a+ 以读写模式打开 (参见 a )

    format 为处理程序使用指定的格式字符串。

    datefmt 使用指定的日期/时间格式。样式如果指定了格式字符串,则使用它来指定 格式字符串的类型.

    level 将根记录器级别设置为指定级别。

     

    logging_test.py

    # 导入模块

    import logging
    # logging.basicConfig(level=logging.DEBUG)
    logging.basicConfig(level=logging.INFO)

    logging.debug('debug info')
    logging.info('hello 嘿嘿)
    logging.warning('warning info')
    logging.error('error info')
    logging.critical('critical info')

    Handler 处理器

    Handler 处理器,将日志记录发送至合适的路径,Handler处理器类型有很多种,比较常用的有三个:

    1.StreamHandler

    将日志记录输出发送到诸如sys.stdout,sys.stderr或任何类似文件流的对象。上面例子就是输出到控制台

    2.FileHandler

    将日志记录输出发送到磁盘文件。 它继承了StreamHandler的输出功能。

    logging.basicConfig(filename='runlog.log',level=logging.DEBUG)

    3.NullHandler

    不做任何格式化或输出。 它本质上是一个开发人员使用的“无操作”处理程序。

    Filter 过滤器

    Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。

    Formatter

    使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

    格式

    描述

    %(levelno)s

    打印日志级别的数值

    %(levelname)s

    打印日志级别名称

    %(pathname)s

    打印当前执行程序的路径

    %(filename)s

    打印当前执行程序名称

    %(funcName)s

    打印日志的当前函数

    %(lineno)d

    打印日志的当前行号

    %(asctime)s

    打印日志的时间

    %(thread)d

    打印线程id

    %(threadName)s

    打印线程名称

    %(process)d

    打印进程ID

    %(message)s

    打印日志信息

    使用方法:

    logging.basicConfig(filename='runlog.log',level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')               

    输出结果

    2019-08-14 14:35:19,430 logging_test.py[line:6]DEBUGdebug info
    2019-08-14 14:35:19,430 logging_test.py[line:7]INFOhello hongge
    2019-08-14 14:35:19,430 logging_test.py[line:8]WARNINGwarning info
    2019-08-14 14:35:19,430 logging_test.py[line:9]ERRORerror info
    2019-08-14 14:35:19,430 logging_test.py[line:10]CRITICALcritical info
     

    Logging实战操作

    测试场景

    将前面所学的启动考研帮App的脚本增加log采集功能,设置指定的日志格式输出,并将日志保存到指定文件。

    代码实现

    kyb_logger.py

    # .导入模块
    from appium import webdriver
    import yaml
    import logging
    from selenium.common.exceptions import NoSuchElementException
    
    file=open('./desired_caps.yaml','r')
    data=yaml.load(file)
    
    logging.basicConfig(level=logging.INFO,filename='runlog.log',
                        format='%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s%(message)s')
    
    desired_caps={}
    desired_caps['platformName']=data['platformName']
    desired_caps['platformVersion']=data['platformVersion']
    desired_caps['deviceName']=data['deviceName']
    
    desired_caps['app']=data['app']
    desired_caps['appPackage']=data['appPackage']
    desired_caps['appActivity']=data['appActivity']
    desired_caps['noReset']=data['noReset']
    
    logging.info('start app...')
    driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
    
    def check_cancelBtn():
        logging.info('check cancelBtn')
    
        try:
            cancelBtn = driver.find_element_by_id('android:id/button2')
        except NoSuchElementException:
            logging.info('no cancelBtn')
        else:
            cancelBtn.click()
    
    def check_skipBtn():
        logging.info('check skipBtn')
    
        try:
            skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
        except NoSuchElementException:
            logging.info('no skipBtn')
        else:
            skipBtn.click()
    
    check_cancelBtn()
    check_skipBtn()
     

    runlog.log

     
    2019-08-14 15:27:38,964 kyb_logger.py[line:32]INFOstart app...
    2019-08-14 15:27:47,641 poolmanager.py[line:358]INFORedirecting http://127.0.0.1:4723/wd/hub/session -> http://127.0.0.1:4723/wd/hub/session/dfc8e7e7-71cc-4f0b-9aa6-5db0fdc98a84
    2019-08-14 15:27:47,644 kyb_logger.py[line:36]INFOcheck cancelBtn
    2019-08-14 15:27:49,442 kyb_logger.py[line:46]INFOcheck skipBtn
  • 相关阅读:
    1.2变量声明的意义
    1.1两个char类型数据相加后,转化为int类型
    欢迎使用CSDN-markdown编辑器
    python-布尔表达式
    程序基本机构
    Python math库和random库
    Python中类型的概念(一)
    Python turtle库的应用——蛇
    Python语法元素分析
    程序设计基本方法
  • 原文地址:https://www.cnblogs.com/lexus168/p/12610217.html
Copyright © 2020-2023  润新知