python 二次封装logging,打印日志文件名正确,且正确写入/结合pytest执行,日志不输出的问题
基于之前日志问题,二次封装日志后,导致日志输出的文件名不对,取到的文件一直都是当前二次封装的log的文件名,基于这个问题,做了优化,详细看
https://www.cnblogs.com/cuitang/p/16547816.html
存在问题:
封装模块名log_print
1、项目A依赖项目B的模块A,项目B的模块A使用的是项目B的log_print,里面配置的filehandler地址是不同的;在项目A使用时,默认取到了项目B模块的filehandler,导致将项目A的日志写到了项目B里面,这个是不对的;-- 产生问题的原因,handlers没有被关闭

2、使用pytest框架,执行测试用例,日志没有输出到控制台,也没有输出到文件
原来的日志模块设计:检测了当前没有日志的handlers,才会去创建,但pytest框架是有自带的loghandler, 所以在使用pytest执行用例时,来到创建这一步,判断已经存在,不会去创建我们自定义的log日志输出和写 入的handlers,所以最后执行完,控制台和日志文件都没有日志输出;-- 产生这个问题原因,也是 因为没有正确的关闭原有的handler,来重新创建自定义的handlers

代码优化:在初始化二次封装logging模块时,获取目前所有的handler,然后循环将其关闭;继续往下设计日志输出模式,然后重新创建,就可以避免以上的问题
def __init__(self):
self.logger = logging.getLogger() # print(f"获取当前的日志logger: {self.logger.handlers}")
# === 1、 在添加handlers之前,先将已存在的移除,后面再重新创建,可以防止日志重复 ===
while self.logger.hasHandlers():
for handler in self.logger.handlers:
self.logger.removeHandler(handler) self.logger.setLevel("DEBUG") # === 2、 设置日志输出格式 ===
self.log_colors_config = {
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
} self.color_fmt = colorlog.ColoredFormatter(
'%(log_color)s%(asctime)s 【%(levelname)s】 [%(filename)s:%(funcName)s:%(lineno)s]-日志信息: %(message)s',
log_colors=self.log_colors_config) self.formatter = logging.Formatter(
'%(asctime)s 【%(levelname)s】 [%(filename)s:%(funcName)s:%(lineno)s]-日志信息: %(message)s') # === 3、 添加日志收集器: 控制台和文件输出
self.logger.addHandler(self.get_console_handler())
self.logger.addHandler(self.get_file_handler())
python 二次封装logging,打印日志文件名正确,且正确写入/结合pytest执行,日志不输出的问题的更多相关文章
- python 以单例模式封装logging相关api实现日志打印类
python 以单例模式封装logging相关api实现日志打印类 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7 实现功能: 支持自由配置,如下lo ...
- python基础--包、logging、hashlib、openpyxl、深浅拷贝
包:它是一系列模块文件的结合体,表现形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,包的本质还是一个模块. 首次导入包:(在导入语句中中 . 号的左边肯定是一个包(文件夹)) ...
- Selenium WebDriver Log4j打印执行日志
在自动化测试脚本的执行过程中,使用log4j在日志文件中打印执行日志,用于监控和后续调试脚本. Log4j.xml 文件 <log4j:configuration xmlns:log4j=&qu ...
- 采坑复盘:logging日志能用封装后的函数来打日志,发现filename一直显示封装logging函数的方法所在的文件名
问题: logging日志能用封装后的函数来打日志,发现filename一直显示封装logging函数的方法所在的文件名 原因: logging记录的是第一个函数执行所在的文件,那用封装的函数,首先执 ...
- python 项目实战之logging日志打印
官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- 【转】python模块分析之logging日志(四)
[转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...
- python模块分析之logging日志(四)
前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...
- Python学习笔记:logging(日志处理)
在一个软件中,日志是可以说必不可少的一个组成部分,通常会在定位客户问题或者记录软件使用情况等场景中会用到.logging模板块是Python的一个内置标准库,用于实现对日志的控制输出,对于平常的日志输 ...
- 【python接口自动化】- logging日志模块
前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间.描述信息以及错误或者异常发生时候的特定上下文信息. logging模块介绍 Pyth ...
随机推荐
- [FAQ] Error occured while trying to proxy to: xx.xx.x.xx:xx/xx
遇到这种情况,要知道证明访问并未到达指定的服务地址. 可能原因有未启动.端口占用 等等,请逐一排查. Tool:ChatAI Refer:Proxy_Error Link:https://www.cn ...
- dotnet 6 在 System.Text.Json 使用 source generation 源代码生成提升 JSON 序列化性能
这是一个在 dotnet 6 早就引入的功能,此功能的使用方法能简单,提升的效果也很棒.使用的时候需要将 Json 序列化工具类换成 dotnet 运行时自带的 System.Text.Json 进行 ...
- Unsortbin attack原理及分析
Unsortbin attack原理 ️条件:首先要实现Unsortbin attack前提是可以控制Unsortbin attack chunk的bk指针 ️目的:我们可以实现修改任意地址为一个比较 ...
- Python数据分析 DataFrame 笔记
08,DataFrame创建 DataFrame是一个[表格型]的数据结构,可以看做是[由Series组成的字典](共用同一个索引).DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Se ...
- 【2023微博评论爬虫】用python爬上千条微博评论,突破15页限制!
目录 一.爬取目标 二.展示爬取结果 三.爬虫代码 四.同步视频 五.获取完整源码 您好,我是@马哥python说,一枚10年程序猿. 一.爬取目标 前些天我分享过一篇微博的爬虫: 马哥python说 ...
- phpstudy8.1安装与配置
环境: window10 phpstudy8.1.1.3 Vmware安装centos7.6 使用场景 window10安装mysql和redis 在Vmware安装centos7.6 桥接模式上网 ...
- golang url解析
package main import "fmt" import "net/url" import "strings" func main( ...
- iOS LLVM 中的宏定义
在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏 SUPPORT_INDEXED_ISA.SUPPORT_PACKED_ISA,代码如下所示: // Define SUPPORT_INDEXED ...
- js文字处理两端展示中间省略号
点击查看代码 function ellipsisText(longText, displayLength) { // 确保显示长度至少包含省略号的3个字符 if (displayLength < ...
- Idefics2 简介: 为社区而生的强大 8B 视觉语言模型
我们很高兴在此发布 Idefics2,这是一个通用的多模态模型,接受任意文本序列和图像序列作为输入,并据此生成文本.它可用于回答图像相关的问题.描述视觉内容.基于多幅图像创作故事.从文档中提取信息以及 ...