Python接口自动化测试输出日志到控制台和文件

news2024/11/19 2:35:11

一、日志的作用

一般程序日志出自下面几个方面的需求:
1. 记录用户操作的审计日志,甚至有的时候就是监管部门的要求。
2. 快速定位问题的根源
3. 追踪程序执行的过程。
4. 追踪数据的变化
5. 数据统计和性能分析
6. 采集运行环境数据
一般在程序上线之后,一旦发生异常,第一件事就是要弄清楚当时发生了什么。用户当时做了什么操作,环境有无影响,数据有什么变化,是不是反复发生等,然后再进一步的确定大致是哪个方面的问题。确定是程序的问题之后再交由开发人员去重现、研究、提出解决方案。这时,日志就给我们提供了第一手的资料。

二、日志级别

1. DEBUG Level
  指出细粒度信息事件,主要用来调试应用程序。

2.INFO level
  表明粗粒度级别,上强调应用程序的运行过程,比如进入某个业务分支。

3. WARN level
  表明出现潜在错误。

4. ERROR leve
  指出虽然发生错误事件,但不影响系统的继续运行。

5.FATAL level
  指出每个严重的错误事件将会导致应用程序的退出。

Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。 等于或高于日志记录器当前配置级别的日志的将被打印出来。

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

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

三、几个重要的概念

Logger 记录器:提供日志的接口,供应用代码使用

Handle 处理器:将(记录器产生的)日志记录发送到哪里,即输出到哪里

Filter 过滤器:提供了更好的粒度控制,它可以决定输出哪些日志记录,提供一种优雅的方式决定一个日志记录是否发送到handle

Formatter 格式化器:指定日志记录输出的具体格式

四、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

        logger.setLevel(logging.ERROR) = 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出(默认级别是warning)

        logger.addHandle(handle_name) = 为Logger实例增加一个处理器

        logger.removeHandle(handle_name) = 为Logger实例删除一个处理器

五、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

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图文组合商标部分驳回后优化后初审通过!

这几天以前有个企业的商标初审下来了&#xff0c;以前是加了图形个别部分没有通过初审&#xff0c;后面是把图形去掉重新用文字申请下来初审。 图形与文字同时申请&#xff0c;会分别审查有一个元素过不了&#xff0c;整体就会过不了&#xff0c;所以平常就会建议分开申请注册商…

Transformers | 在自己的电脑上开启预训练大模型使用之旅!

本文内容主要包括两部分&#xff1a; Hugging Face 社区介绍 如何使用 Transformers 库的模型 1. Hugging Face 社区介绍 Hugging Face (https://huggingface.co/) 是一个 Hub 社区&#xff0c;它和 GitHub 相同的是&#xff0c;他们都是基于 Git 进行版本控制的存储库社区&…

探寻大模型时代智慧农业新未来,商汤与上海市农委达成战略合作

近日&#xff0c;在中国农民丰收节上海会场丰收庆典活动上&#xff0c;商汤科技与上海市农业农村委员会&#xff08;下称&#xff1a;上海市农委&#xff09;签署战略合作协议&#xff0c;双方将依托先进的AI大模型技术&#xff0c;共同推进上海智慧农业发展&#xff0c;打造国…

ESXI主机加入VCENTER现有集群提示出现常规性错误

背景&#xff1a;由于忘记了这台主机的root密码&#xff0c;所以在迁移完虚拟机后给这台主机重新安装了操作系统&#xff0c;装完操作系统加集群提示如下报错&#xff1a; 查阅了一些资料后发现主机的CPU是一样的&#xff0c;不需要开EVC&#xff1b; 也有一些说需要改这个配置…

《关键跃升读书笔记》11

协作&#xff1a; 怎么解决“容忍⿊”这类问题&#xff1f;我们要重新理解“⽂化”。⼈类⽂化、企 业⽂化&#xff0c;都是为了让⼈们更好地协作。 再⼩的公司&#xff0c;再⼩的团队&#xff0c;都是⼀个共同协作体&#xff0c;就像整个⼈类社会 是共同协作体。理解了⼈类社会…

“被卷”还是“破卷”,咱有得选

职场内卷是一个当下社会备受热议的话题。身处内卷中的人&#xff0c;所感受到的是价值感不足、低效、无奈等消极内容&#xff0c;但哪怕知道处于那样的工作环境是不健康的&#xff0c;因为环境所迫&#xff0c;似乎也只能被裹挟。 就如当下热播的都市剧《凡人歌》中的那隽&…

Kubernetes 深入浅出系列 | 容器剖析之容器基本实现原理

一、容器基本实现原理 Docker 主要通过如下三个方面来实现容器化&#xff1a; ① 使用操作系统的 namespace 隔离系统资源技术&#xff0c;通过隔离 网络、PID 进程、系统信号量、文件系统挂载、主机名和域名&#xff0c;来实现在同一宿主机系统中&#xff0c;运行不同的容器&…

6种常见位运算符+异或运算符的使用(加密、解密)

一、位运算符 位运算符进行的是整数与整数之间的运算 1、右移运算符&#xff1a;>> &#xff08;1&#xff09;相当于对整数除以2 &#xff08;2&#xff09;举例&#xff1a; int num 2; System.out.println(num >> 1); 2、左移运算符&#xff1a;<< …

数据结构---顺序表之单链表

1.链表的概念 链表是一种逻辑上是线性的&#xff0c;但物理结构不一定是线性的数据结构&#xff0c;它通过链表中的指针链接次序实现的 链表的存储空间是我们通过动态内存开辟的内存空间&#xff0c;所以他们的地址可能是连续的也可能不是连续的 2.链表的分类 1.单向或者双向…

PostgreSQL JAVA与SQL集成之PL/Java

PostgreSQL pljava PL/Java 作为 PostgreSQL 的编程语言扩展之一&#xff0c;与 PL/pgSQL&#xff08;PostgreSQL 原生的存储过程语言&#xff09;相比&#xff0c;提供了 Java 语言特有的面向对象功能&#xff0c;并支持 Java 的标准库和第三方库。由于 Java 是一种跨平台的语…

Python 聊聊有内置函数,又该怎么学习内置函数

前言 python有内置函数的概念&#xff0c;从Python3.x开始&#xff0c;内置函数位于builtins模块&#xff0c;比如我们常用的内置函数len()&#xff0c;其实它是builtins模块下的属性&#xff0c;我们也可以builtins.len&#xff08;&#xff09;去访问&#xff0c;当然因为每个…

海豚调度运行成功但无法生成实例解决

海豚调度运行成功但无法生成实例解决 问题描述 点击运行&#xff0c;提示运行成功但无法在工作实例中看到 问题定位 查看资源监控&#xff0c;内存占用80% 查看master日志 tail -f /home/dolphinscheduler/tmp/dolphinscheduler/master-server/logs/dolphinscheduler-m…

无刷直流电机内阻小和大有什么区别

‌直流电机的内阻小和大各有其特点和应用场景。 ‌ 内阻小的直流电机通常具有较小的线圈匝数&#xff0c;这意味着在工作时消耗的电流较大&#xff0c;从而在同一转速下能够提供较大的扭矩。这种电机适用于需要较大扭矩的应用场景&#xff0c;例如重载启动或需要较高机械效率的…

模型django封装uvicorn服务器部署实战

Uvicorn 是一个轻量级的 ASGI 服务器&#xff0c;它基于 uvloop 和 httptools 这两个高性能的异步库。Uvicorn 提供了快速的启动时间和低延迟的响应&#xff0c;非常适合用于生产环境。 Django&#xff1a; 是一个开源且强大的Web框架&#xff0c;适用于快速开发和部署Python …

Spring中存储Bean的常见注解

目录 IoC & DI IOC&#xff08;控制反转&#xff09;详解 依赖注入的三种方式 IoC & DI IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 控制反转&#xff1a;也就是控制权反转. 什么的控制权发⽣了反转? 获得依赖对…

成为谷歌开发者专家(GDE)的经历

大家好&#xff0c;我是张海龙(Jason)。经过一年多的准备&#xff0c;GDE申请 终于正式成功通过面试&#xff0c;成为了国内第一位Firebase GDE。下面对整个过程做个总结&#xff0c;希望对大家有所帮助。 1.什么是 GDE&#xff1f; Google Developers上面有详细的说明&#x…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓&#xff0c;可以分成⼏⾏写&#xff0c;除了最后⼀⾏外&#xff0c;每⾏的后⾯都加⼀个反…

DataWhale X 南瓜书学习笔记 task03笔记

对数几率回归 使用场景&#xff1a;分类任务。根据广义线性模型&#xff0c;分类任务构建模型的基本思想&#xff1a;找到一个单调可微函数将分类任务的真实标记&#xff08;值&#xff09;与线性回归模型的预测值联系起来。 对数几率回归的引入 二分类任务 输出标记&#…

从角速度向量的角度理解姿态角速度和机体角速度的转换公式

一、什么是姿态角速度 这是我从《多旋翼飞行器设计和控制》上截取的关于欧拉角的定义。无人机的姿态角速度即偏航角、俯仰角、滚转角的一次导数&#xff0c;分别是、、。 二、什么是机体角速度 这是我在网上随便找的图&#xff0c;展示了机体坐标系。这个坐标系与飞机固定连接&…

技术美术百人计划 | 《5.1.2 PBR-基于物理的相机》笔记

一、曝光三角形 1、曝光主要由三个参数控制 快门速度&#xff08;Shutter Speed&#xff09; 可以获得运动模糊&#xff08;Motion&#xff09; 光圈&#xff08;Aperture&#xff09; 可以获得景深&#xff08;Depth of Field&#xff09; 感光度&#xff08;ISO&#xff0…