来自 APP Android 端自动化测试初学者的笔记,写的不对的地方大家多多指教哦。😋

一、日志的作用

在项目开发及测试中,日志能够帮助准确的定位问题,且进行问题的分析

二、日志级别

优先级为:DEBUG<INFO<WARNING<ERROR<CRITICAL

日志的默认级别是 warning 级别及以上,debug 和 info 都不会再控制台输出

三、几个重要的概念

四、Logger 记录器

1、概述

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

创建的方法:logger = logging.getLogger(logger_name)

Logger 对象从不直接实例化,而是通过模块级别的功能

Logging.getLogger(name) 创建 logger 实例,调用 logging.getLogger(name) 功能时,如果传入的 name 参数值相同,则总是返回一个 logger 对象实例的应用。

2、创建 Logger 实例后,可以用以下方法进行日志级别设置,增加处理器 Handle

五、Handle 处理器

1、概述

handle 将日志信息发送到指定的位置(文件、窗口)

Handle 处理器的类型:StreamHandle,FileHandle,NullHandle

2、StreamHandle

创建方法:sh = logging.StreamHandle(stream==None)

将日志输出发送到控制台

3、FileHandle

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

创建方法:fh = logging.FileHandle(filename,mode='a',encoding=None,delay=False)

4、NullHandle

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

本质上是一个 “什么都不做” 的 handle,由库开发者使用

六、Formatter 格式化器

1、概述

用于设置日志的输出格式

创建方法:formatter = logging.Formatter(fmt=None,datefmt=None),fmt 和 datefmt 是用来设置日志格式和时间格式

默认的格式:%(asctime) s-%(levelname) s-%(message) s

默认的时间格式:%Y-%m-%d %H:%M:%S

2、使用 Formatter 对象设置日志信息最后的规则、结构和内容

七、日志在实际测试用例中的应用

封装类有便于外部文件对日志的调用,例子主要完成在控制台输出日志和日志输出到外部的.log 文件中

封装日志类的步骤:

创建 logger

创建 handle

创建 formatter

配置 logger

上栗子:

1.在工程目录下创建类的外部 log 文件:test.log

2.封装 Logger 类:

# 日志综合案例的封装
import logging

class Logger():
    def __init__(self, LoggerName, FileName, CmdLevel, FileLevel):
        # LoggerName:实例化对象的名字  FileName:外部文件名   CmdLevel:设置控制台中日志输出的级别  FileLevel:设置文件日志输出的级别
        self.logger = logging.getLogger(LoggerName)
        # 设置日志的级别
        self.logger.setLevel(logging.DEBUG)
        # 设置日志的输出格式
        fmt = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')

        # 借助handle将日志输出到test.log文件中
        fh = logging.FileHandler(FileName)
        fh.setLevel(FileLevel)

        # 借助handle将日志输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(CmdLevel)

        # 配置logger
        fh.setFormatter(fmt)
        ch.setFormatter(fmt)

        # 给logger添加handle
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def debug(self,message):
        self.logger.debug(message)

    def info(self,message):
        self.logger.info(message)

    def warn(self,message):
        self.logger.warning(message)

    def error(self,message):
        self.logger.error(message)

    def critical(self,message):
        self.logger.critical(message)

# 如下为测试代码,实际运行中可以注释掉
if __name__ == "__main__":
    logger = Logger("appium","test.log",CmdLevel=logging.DEBUG,FileLevel=logging.INFO)
    logger.debug("debug message!")
    logger.info("info message!")
    logger.warn("warning message!")
    logger.error("error message!")
    logger.critical("critical message!")

3.调用 Loger 类:

在类的外部创建 Logger 类的实例化对象,传入需要的参数

# 其他类中调用Loger类
# 实例化Logger类,并传入参数
logger = Logger("appium", "test.log", CmdLevel=logging.DEBUG, FileLevel=logging.INFO)

class Test:
    logger.debug("debug message!")
    logger.info("info message!")
    logger.warn("warning message!")
    logger.error("error message!")
    logger.critical("critical message!")

4.输出结果:

控制台
2020-09-10 10:32:46,230-appium-DEBUG-debug message!
2020-09-10 10:32:46,230-appium-INFO-info message!
2020-09-10 10:32:46,230-appium-WARNING-warning message!
2020-09-10 10:32:46,230-appium-ERROR-error message!
2020-09-10 10:32:46,230-appium-CRITICAL-critical message!

外部文件
20-09-10 10:32:46,230-appium-INFO-info message!
2020-09-10 10:32:46,230-appium-WARNING-warning message!
2020-09-10 10:32:46,230-appium-ERROR-error message!
2020-09-10 10:32:46,230-appium-CRITICAL-critical message


↙↙↙阅读原文可查看相关链接,并与作者交流