zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    22. Generate Parentheses (backTracking)
    21. Merge Two Sorted Lists
    20. Valid Parentheses (Stack)
    19. Remove Nth Node From End of List
    18. 4Sum (通用算法 nSum)
    17. Letter Combinations of a Phone Number (backtracking)
    LeetCode SQL: Combine Two Tables
    LeetCode SQL:Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/lexus168/p/12610217.html
Copyright © 2011-2022 走看看