接口测试 — 11.logging日志模块处理流程

1、概括理解

了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程:

也就是获取的日志信息,进入到Logger日志器中,传递给处理器确定要输出到哪里,然后进行过滤器筛选,通过后再按照定义的格式进行日志的输出。

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

2、详细说明

描述上面这个图的日志流处理流程:

  • 1)在用户代码中进行日志记录函数调用,如:logger.info(…),logger.debug(…)等;

  • 2)判断要记录的日志级别是否满足日志器设置的级别要求。

    要记录的日志级别要大于或等于日志器设置的级别才算满足要求,如果不满足则该日志记录会被丢弃,并终止后续的操作,如果满足则继续下一步操作;

  • 3)根据日志记录函数调用时传入的参数,创建一个日志记录(LogRecord类)对象;

  • 4)判断日志记录器上设置的过滤器是否拒绝这条日志记录,如果日志记录器上的某个过滤器拒绝,则该日志记录会被丢弃并终止后续的操作。如果日志记录器上设置的过滤器,不拒绝这条日志记录,或者日志记录器上没有设置过滤器,则继续下一步操作,将日志记录分别交给该日志器上添加的各个处理器;

  • 5)判断要记录的日志级别是否满足处理器设置的级别要求。

    要记录的日志级别要大于或等于该处理器设置的日志级别才算满足要求,如果不满足记录将会被该处理器丢弃并终止后续的操作,如果满足则继续下一步操作;

  • 6)判断该处理器上设置的过滤器是否拒绝这条日志记录,如果该处理器上的某个过滤器拒绝,则该日志记录会被当前处理器丢弃并终止后续的操作。如果当前处理器上设置的过滤器不拒绝这条日志记录,或当前处理器上没有设置过滤器测继续下一步操作;

  • 7)如果能到这一步,说明这条日志记录经过了层层关卡允许被输出了,此时当前处理器会根据自身被设置的格式器(如果没有设置则使用默认格式),会将这条日志记录进行格式化,最后将格式化后的结果,输出到指定位置(文件、网络、类文件的Stream等);

  • 8)如果日志器被设置了多个处理器的话,上面的第5-8步会执行多次;

  • 9)这里才是完整流程的最后一步:判断该日志器输出的日志消息是否需要传递给上一级logger。

    日志器是有层级关系的,如果propagate属性值为1,则表示日志消息将会被输出到处理器指定的位置,同时还会被传递给parent日志器的handlers进行处理,直到当前日志器的propagate属性为0停止,如果propagate值为0则表示不向parent日志器的handlers传递该消息,到此结束。

可见,一条日志信息要想被最终输出需要依次经过以下几次过滤:

  • 日志器等级过滤;
  • 日志器的过滤器过滤;
  • 日志器的处理器等级过滤;
  • 日志器的处理器的过滤器过滤;

3、应用示例

(1)需求:

  • 1)要求将所有级别的所有日志都写入磁盘文件中
  • 2)all.log文件中记录所有的日志信息,日志格式为:日期和时间 - 日志级别 - 日志信息
  • 3)error.log文件中单独记录error及以上级别的日志信息,日志格式为:日期和时间 - 日志级别 - 文件名[:行号] - 日志信息
  • 4)要求all.log在每天凌晨进行日志切割。

(2)分析:

  • 1)要记录所有级别的日志,因此日志器的有效level需要设置为最低级别DEBUG;

  • 2)日志需要被发送到两个不同的目的地,因此需要为日志器设置两个handler;

    另外,两个目的地都是磁盘文件,因此这两个handler都是与FileHandler相关的;

  • 3)all.log要求按照时间进行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler类;

    error.log没有要求日志切割,因此可以使用FileHandler类;

  • 4)两个日志文件的格式不同,因此需要对这两个handler分别设置格式器;

(3)示例

# 导入logging模块
import logging
import logging.handlers
# 或者 from logging.handlers import TimedRotatingFileHandler
import datetime# 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger')
# 设置logger日志级别
logger.setLevel(logging.DEBUG)# 定义处理器1
# 这里进行简化
# rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7,
#                                                        atTime=datetime.time(0, 0, 0, 0))
"""
`TimedRotatingFileHandler`位于`logging.handlers`模块中, 
支持按一定时间间隔更换磁盘日志文件。这样就可以保证日志单个文件不会太大。
可以根据官方文档自己学习:
https://docs.python.org/zh-cn/3/library/logging.handlers.html
"""all_handler = logging.FileHandler('../log/all.log', encoding="utf-8")# 给处理器传入格式器
all_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))# 定义处理器2
error_handler = logging.FileHandler('../log/error.log', encoding="utf-8")
# 设置处理器日志级别
error_handler.setLevel(logging.ERROR)
# 给处理器传入格式器
error_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))# 把两个处理器添加到日志器中
logger.addHandler(all_handler)
logger.addHandler(error_handler)logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

执行结果:

all.log文件输出

2021-01-15 23:12:27,197 - DEBUG - debug message
2021-01-15 23:12:27,198 - INFO - info message
2021-01-15 23:12:27,198 - WARNING - warning message
2021-01-15 23:12:27,198 - ERROR - error message
2021-01-15 23:12:27,198 - CRITICAL - critical message

error.log文件输出

2021-01-15 23:12:27,198 - ERROR - demo_log3.py[:35] - error message
2021-01-15 23:12:27,198 - CRITICAL - demo_log3.py[:36] - critical message

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用STM32和可控硅控制220V加热电路

利用STM32和可控硅控制220V加热电路 Chapter1 利用STM32和可控硅控制220V加热电路一、错误原理图二、正确原理图 Chapter2 可控硅驱动芯片MOC3081/3061Chapter3 一个MOC3061的可控硅触发电路的分析Chapter4 可控硅的两种触发方式:移相触发和过零触发1、过零触发2、移…

将遗留系统分解为微服务:第 2 部分

在当今不断发展的技术环境中,从整体架构向微服务的转变对于许多企业来说都是一项战略举措。这在报销计算系统领域尤其重要。正如我在上一篇文章第 1 部分应用 Strangler 模式将遗留系统分解为微服务-CSDN博客中提到的,让我们探讨如何有效管理这种转变。 …

华为设备VRP系统管理

为了满足企业业务对网络的需求,网络设备中的系统文件需要不断进行升级。另外,网络设备中的配置文件也需要时常进行备份,以防设备故障或其他灾害给业务带来损害。在升级和备份系统文件或配置文件时,经常会使用FTP和TFTP来传输文件。…

vue3项目 - 目录调整

省流 删除默认文件,修改代码 ---> 调整目录结构 ---> 添加全局样式和图片,安装预处理器 具体步骤: 1. 删除初始化的默认文件,修改剩余代码 清空 assets、components、stores、views文件夹里的文件,仅留核心文件…

四. 基于环视Camera的BEV感知算法-PETR

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. PETRv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章——基…

2023年12月24日学习总结

今日to do list: 做kaggle上面的流量预测项目☠️ 学习时不刷手机🤡 okkkkkkkkkkkkkk 开始👍🍎 0、我在干什么? 我在预测一个名字叫做elborn基站的下行链路流量,用过去29天的数据预测未来10天的数据 1、…

python调用DALL·E绘画

实现用gpt的api和他对话后,我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

MySQL数据库增删改查

常用的数据类型: int:整数类型,无符号的范围【0,2^32-1】,有符号【-2^31,2^31-1】 float:单精度浮点,4字节64位 double:双精度浮点,8字节64位 char:固定长…

软件测试5未来大发展路线,测试工程师发展偏向

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试的五大…

ubuntu docker 进入容器内使用ping 指令,提示bash: ping: command not found问题

解决方法 #更新软件列表 apt update #安装 ping 工具iputils-ping apt install -y iputils-ping #最后使用ping一下容器ping 172.18.0.3欢迎关注我的公众号“点滴分享技术猿”,原创技术文章第一时间推送。

leetcode 371. 两整数之和(优质解法)

链接&#xff1a;371. 两整数之和 代码&#xff1a; class Solution {public int getSum(int a, int b) {while(b!0){int numa^b; //无进位值int bit(a&b)<<1; //进位anum;bbit;}return a;} } 题解&#xff1a; 要计算两个数相加并且不能使用 - 号&#xff0…

MyBatis-Plus中默认方法对应的SQL到底长啥样?

我希望成为&#xff1a;自媒体圈中技术最好、实战经验最丰富的达人&#xff0c;技术圈中最会分享的架构师。加油&#xff01; 我的公众号&#xff1a;Hoeller 过段时间要给公司同事做Mybatis-Plus相关的培训&#xff0c;所以抓紧时间看看Mybatis-Plus的源码&#xff0c;顺便也分…