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

news2024/10/1 3:31:33

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.coloradmin.cn/o/1333006.html

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

相关文章

linux系统和网络(三):IO,信号,信号量,线程

本文主要探讨linux的IO,信号,信号量,线程相关知识,详细知识可参考本博客其他文章。 信号(可参考本博客其他文章) 信号是内容受限的异步通信机制,硬件异常后统内核发出信号 alarm产生SIGALARM信号,读端关闭后管道write产生SIGPIPE信号 常见信号…

FHE简介

1. 引言 加密技术已经存在了数千年,用于相互发送秘密信息。例如,凯撒密码是最早的加密技术之一,可以追溯到公元前60年,其只由字母表中的字母交换组成。 随着互联网的出现,人们生成的私人数据量呈指数级增长&#xff…

第11章 GUI Page429~430 步骤八 支持“十字”形

运行效果&#xff1a; 关键代码&#xff1a; 新增头文件&#xff1a; //item_cruciform.hpp #ifndef ITEM_CRUCIFORM_HPP_INCLUDED #define ITEM_CRUCIFORM_HPP_INCLUDED#include <cmath> #include "item_line.hpp"class CruciformItem : public IItem { pub…

图像识别SLIC、Haralick texture features(自备)

SLIC 简单线性迭代聚类(SLIC ),它采用k-means聚类方法来有效地生成超像素。 SLIC超像素分割详解&#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09;_超像素分割 样本-CSDN博客 超像素分割 & SLIC算法 & 使用示例_slic分割算法matlab-C…

C语言、c++实现超好玩植物大战僵尸(完整版附源码)

实现这个游戏需要Easy_X main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏 //4实现工具栏里面的游戏卡牌 #define WIN_WIDTH 900 #define WIN_HEIGHT 600 //定义植物类型 enum { WAN_DOU, XIANG_RI_KUI, ZHI_WU_COUNT }; #include<stdio.…

SpringMVC:整合 SSM 中篇

文章目录 SpringMVC - 04整合 SSM 中篇一、优化二、总结三、说明注意&#xff1a; SpringMVC - 04 整合 SSM 中篇 一、优化 在 spring-dao.xml 中配置 dao 接口扫描&#xff0c;可以动态地实现 dao 接口注入到 Spring 容器中。 优化前&#xff1a;手动创建 SqlSessionTempl…

『OPEN3D』1.1 点云处理

目录 1.open3d中的点云IO 2.点云的可视化 3 点云voxel下采样 4. 顶点法线估计 5.最小外界矩 6. 凸包计算 7. 点云距离计算 8. DBSCAN clustering聚类 9. RANSAC(Random Sample Consensus) 10. 点云平面分割 11. 隐藏点移除 12.outliers移除 13 最远点采样&#xf…

视频编码码率控制

什么是码率控制 码率控制是编码器的一个重要模块&#xff0c;主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分&#xff0c;但是它并不是编码标准的一部分&#xff0c;也就是说&#xff0c;标准并没有给码控设定规则。我们平时用的编码器…

sql_lab之sqli注入中的cookie注入

Cookei注入&#xff08;gxa的从cookei注入&#xff09; 1.打开控制台 2.验证id2时的值 document.cookie"id2" 3.判断是上面闭合方式 document.cookie"id2 -- s" 有回显 说明是’单引号闭合 4.用order by 判断字段数 5.用联合查询判断回显点 接下来的…

html5 实现网页截屏 页面生成图片

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"referrer" content"no-referrer" /><meta name"viewport"content"widthdevice-width,intial-sc…

前端开发新趋势:Web3 与虚拟现实的技术融合

在当今互联网技术日新月异的时代&#xff0c;Web技术也在不断地发展和变革。从前端开发的角度来看&#xff0c;新技术的涌现和旧技术的迭代让前端开发者们面临着前所未有的挑战和机遇。Web3 与虚拟现实&#xff08;VR&#xff09;的技术融合&#xff0c;正是当前前端开发领域的…

dpc与线程切换

中断服务例程 延迟过程调用 线程切换 键盘信号传输 1. 背景 我一般用ctrlaltdel能否呼出winlogon桌面作为Windows卡死&#xff08;hang&#xff09;还是个别程序卡死的鉴别手段。因为一则用户态的程序没办法干扰这个呼出流程&#xff0c;二则如果不能呼出任务管理器来终止进程…

openmediavault基本操作

omv基本操作 使用hostname访问共享文件夹设置1.挂载磁盘2.提交更改3.新建用户4.建立共享文件夹5.设置SMB/CIFS服务7.测试7.1.速度测试 使用hostname访问 把网口和wifi设置成DHCP,使用hostname访问,这样把NAS拿到任何地方都不需要配置了,自动联网进行访问. #网络->常规 #设…

搭建谷歌 Gemini,体验谷歌版GPT4

12.06 日谷歌 DeepMind CEO 和联合创始人 Demis Hassabis 正式推出了大模型Gemini 目前&#xff0c;Gemini 1.0 提供了三个不同的尺寸版本&#xff0c;分别如下&#xff1a; Gemini Ultra&#xff1a;规模最大、能力最强&#xff0c;用于处理高度复杂的任务&#xff1b;Gemin…

map容器的基本使用

文章目录 mapmap模板参数默认构造迭代器[ ]{ }inserterasefindlower_bound && upper_boundcountequal_range map和set容器&#xff0c;multimap和multiset是树形结构的关联式容器&#xff0c;这四种容器底层原理都是红黑树&#xff0c;容器中的元素是一个有序序列。 ma…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载 点我立即下载

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…