日志以及日志封装

日志

输出日志信息

import logging# 调用 指定级别 输入日志信息
logging.debug("this is a debug")
logging.info("this is a info")
logging.warning("this is a warning")
logging.error("this is a error")
logging.critical("this is a critical")

这些为常量  

设置日志级别

import logging# 设置日志级别 常量
logging.basicConfig(level=logging.DEBUG)# 调用 指定级别 输入日志信息
logging.debug("this is a debug")
logging.info("this is a info")
logging.warning("this is a warning")
logging.error("this is a error")
logging.critical("this is a critical")

设置日志格式

import loggingfmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
# 不同样式 自己修改
# fmt = '%(asctime)s %(levelname)s [%(name)s] |%(filename)s(%(funcName)s:%(lineno)d)| - %(message)s'
logging.basicConfig(level=logging.INFO,format=fmt)logging.debug("调试")
logging.info("信息")
logging.warning("警告")
logging.error("错误")

 输入到文件中

import loggingfmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'logging.basicConfig(level=logging.INFO,format=fmt,filename="./log/l1.log")logging.debug("调试")
logging.info("信息")
logging.warning("警告")
logging.error("错误")

logging应用

info在base

error在test_login业务层

出错抛异常 error 异常打印日志

时间切割:重要

输出到终端中 加处理器

"""学习logging底层 模块实现
"""import logging# 获取logger
logger = logging.getLogger()# 获取控制台 处理器
sh = logging.StreamHandler()
# 将处理器添加到logger
logger.addHandler(sh)# 设置级别
logger.setLevel(logging.INFO)
logging.info("info")
logging.debug("debug")

添加文件处理器 既可以输出到文件中

import logging.handlers
# logging 是包名 导入包名时会自动执行包下面的__init__文件 所以这样导入 相当于导入logging
# handlers是模块名# 获取logger
logger = logging.getLogger()
# 获取控制台 处理器
sh = logging.StreamHandler()
# 到文件 根据时间切割
fh = logging.handlers.TimedRotatingFileHandler(filename="./log/log_time.log",when="M",interval=1,backupCount=3)
# 将处理器添加到logger
logger.addHandler(sh)
logger.addHandler(fh)
# 设置级别
logger.setLevel(logging.INFO)
logging.info("info")
logging.debug("debug")

加格式器

import logging.handlers
# logging 是包名 导入包名时会自动执行包下面的__init__文件 所以这样导入 相当于导入logging
# handlers是模块名# 获取logger
logger = logging.getLogger()
# logger = logging.getLogger("admin")
# 获取控制台 处理器
sh = logging.StreamHandler()
# 到文件 根据时间切割
# 一分钟保存一个文件 有三个备份
fh = logging.handlers.TimedRotatingFileHandler(filename="./log/log_time.log",when="M",interval=1,backupCount=3)fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
fm = logging.Formatter(fmt)sh.setFormatter(fm)
fh.setFormatter(fm)
# 将处理器添加到logger
logger.addHandler(sh)
logger.addHandler(fh)
# 设置级别
logger.setLevel(logging.INFO)
logging.info("info")
logging.debug("debug")

1.设置logger同一级别 为所有处理器的最低级别 就算是自己设置的 也要遵循其最低级别

2.设置单个处理器

import logging.handlers
# logging 是包名 导入包名时会自动执行包下面的__init__文件 所以这样导入 相当于导入logging
# handlers是模块名# 获取logger
logger = logging.getLogger()
# logger = logging.getLogger("admin")
# 获取控制台 处理器
sh = logging.StreamHandler()
# 到文件 根据时间切割
# 一分钟保存一个文件 有三个备份
th = logging.handlers.TimedRotatingFileHandler(filename="./log/log_time.log",when="M",interval=1,backupCount=3)th.setLevel(logging.ERROR) # 只显示error及其以上
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
fm = logging.Formatter(fmt)sh.setFormatter(fm)
th.setFormatter(fm)
# 将处理器添加到logger
logger.addHandler(sh)
logger.addHandler(th)
# 设置级别
logger.setLevel(logging.INFO)
logging.info("info")
logging.debug("debug")
logging.error("error")
logging.warning("warning")
logger.setLevel(logging.WARNING)
th.setLevel(logging.DEBUG) # 也只会显示WARNING以上级别的

封装logger 这里用了单例 不使用单例封装:会重复

S 1 3 一秒钟保存一个 有三个备份

midnight 1 3 一整夜保存一个 有三个备份

使用单例封装
import logging.handlersclass GetLogger:logger = None@classmethoddef get_logger(cls):if cls.logger is None:cls.logger = logging.getLogger()cls.logger.setLevel(logging.INFO)sh = logging.StreamHandler()th = logging.handlers.TimedRotatingFileHandler(filename="../../log/l4.log",when="midnight",interval=1,backupCount=3,encoding="utf-8")fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'fm = logging.Formatter(fmt)sh.setFormatter(fm)th.setFormatter(fm)cls.logger.addHandler(sh)cls.logger.addHandler(th)return cls.logger
from selenium.webdriver.support.wait import WebDriverWait
import time
from case_login.base.get_logger import GetLogger# 使用单例
log = GetLogger().get_logger()class Base:def __init__(self, driver):log.info("正在初始化driver{}".format(driver))self.driver = driverdef base_find_element(self, loc, timeout=30, poll=0.5):log.info("正在查找元素{}".format(loc))return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(lambda x: x.find_element(*loc))def base_click(self, loc):log.info("正在点击元素{}".format(loc))self.base_find_element(loc).click()def base_input(self, loc, value):log.info("正在给元素输入内容{}".format(loc))el = self.base_find_element(loc)# 清空log.info("正在给元素{}清空".format(loc))el.clear()# 输入log.info("正在给元素{}输入内容".format(loc))el.send_keys(value)def base_get_text(self, loc):# 注意:一定要返回元素的文本信息log.info("正在获取元素{}文本".format(loc))return self.base_find_element(loc).text# 截图def base_get_screen_shot(self):self.driver.get_screenshot_as_file("../../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))# 封装判断元素是否存在def base_if_exist(self, loc):try:self.base_find_element(loc, timeout=2)log.info("元素{}存在".format(loc))return Trueexcept:log.info("元素{}不存在".format(loc))return False
from case_login.tool.get_log import get_logging
from case_login.base.get_logger import GetLoggerlog = GetLogger().get_logger()def get_data():arr = []for data in read_json("login.json").values():arr.append((data.get("username"),data.get("password"),data.get("verify_code"),data.get("expect_result"),data.get("success")))return arr  # 注意:必须进行return 返回# def get_data():
#     arr = []
#     for data in read_txt("login.txt"):
#         arr.append(tuple(data.strip().split(",")))
#     return arr# 新建测试类
class TestLogin(unittest.TestCase):login = None@classmethoddef setUpClass(cls):try:# 实例化 获取页面对象 PageLogincls.login = PageLogin(GetDriver().get_driver())# 点击登录连接cls.login.page_click_login_link()except Exception as e:log.error(e)# tearDown@classmethoddef tearDownClass(cls):sleep(3)# 关闭 driver驱动对象GetDriver().quit_driver()def tearDown(self):self.login.driver.refresh()# 登录测试方法@parameterized.expand(get_data())def test_login(self, username, pwd, code, expect_result, success):# 调用登录方法self.login.page_login(username, pwd, code)if success:try:# 判断安全退出是否存在self.assertTrue(self.login.page_is_login_success())# 点击退出self.login.page_click_logout()try:# 判断登录是否存在self.assertTrue(self.login.page_is_logout_success)except:# 截图self.login.page_get_img()# 点击登录连接self.login.page_click_login_link()except Exception as e:# 截图self.login.page_get_img()log.error(e)else:# 获取登录提示信息msg = self.login.page_get_error_info()try:# 断言self.assertEqual(msg, expect_result)except AssertionError:# 截图self.login.page_get_img()# 点击 确认框self.login.page_click_err_btn_ok()

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

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

相关文章

理解前端内存泄露

JS里已经分配内存地址的对象,但是由于长时间没有释放或者没办法清除,造成长期占用内存的现象,会让内存资源大幅度浪费,最终导致运行速度慢,甚至崩溃的情况。 造成内存泄露的因素: 全局变量的不当使用&#…

学习一下C++中的枚举的定义

目录 普通枚举 强类型枚举 普通枚举 枚举类型在C中是通过关键字enum来定义的。下面是一个简单的例子: enum Color { RED, GREEN, BLUE }; 在这个例子中,我们定义了一个名为Color的枚举类型,它包含了三个枚举值:RED、GRE…

vue判断组件的值是否传过来

在 Vue 中,判断组件是否接收到了传入的属性值(props),你可以直接在组件内部检查这些属性是否已定义和是否具有有效的值。下面是一个基本的示例: 首先,假设你有一个父组件,它向子组件传递了一个…

大数据面试题之Spark(6)

Spark输出文件的个数,如何合并小文件? Spark的driver是怎么驱动作业流程的? Spark SQL的劣势? 介绍下Spark Streaming和Structed Streaming Spark为什么比Hadoop速度快? DAG划分Spark源码实现? Spark Streaming的双流join的过程,怎么做的? …

阿里云再次突发故障,高可用形同虚设?

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

JAVA实现麦克风说话同声传译

一、能力与场景说明 同声传译,又称同步口译或同声翻译,是一种专业的口译形式,指的是在讲话者发言时,口译员几乎同时将讲话内容翻译成目标语言。这种翻译方式通常用于国际会议、高级别政治或商业会谈、研讨会和其他需要即时多语言…

HarmonyOS Next 原生应用开发-从TS到ArkTS的适配规则(一)

一、强制使用静态类型 静态类型是ArkTS最重要的特性之一。如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前…

【UE 网络】多人游戏开发时应该如何区分客户端逻辑和服务端逻辑 入门篇

目录 0 引言1 服务器和客户端逻辑1.1 服务器职责1.2 客户端职责 2 函数会在客户端执行还是服务端?2.1 只在客户端执行的函数RepNotifyClient RPCMulticast RPC 2.2 只在服务端执行的函数GameModeServer RPC 2.3 在两端都可以执行的函数GetNetMode() 和 HasAuthority…

LangGraph 和 AutoGen 的对比

LangGraph 和 AutoGen 都是用于构建大型语言模型 (LLM) 应用程序的框架。它们都旨在使开发人员更容易地控制 LLM 并使其适应特定任务。但是,这两种框架之间存在一些关键差异。 代理架构 LangGraph 和 AutoGen 之间最大的区别在于代理的构建方式。LangGraph 使用更…

用C#的MediaDevices程序集打开MTP设备(用usb线连接的手机)的文件夹

一、任务描述 1、可以访问MTP设备的桌面程序。 MTP设备:支持媒体传输协议(MTP)的设备,MTP简单来说就是一种PC与其他设备相连的一种协议,智能手机、平板电脑、数码相机等可以通过 USB 连接到电脑,并通过 MTP 协议传输媒体文件。点…

PLC_博图系列☞F_TRIG:检测信号下降沿

PLC_博图系列☞F_TRIG:检测信号下降沿 文章目录 PLC_博图系列☞F_TRIG:检测信号下降沿背景介绍F_TRIG: 检测信号下降沿说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 F_TRIG 背景介绍 这是一篇关于PLC编程的文章&a…

httpx.HTTPStatusError: Client error ‘429 Too Many Requests‘ for url ‘

httpx.HTTPStatusError: Client error ‘429 Too Many Requests’ for url ‘https://open.bigmodel.cn/api/paas/v4/chat/completions’ For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429 错误解释: httpx.HTTPStatusE…

LeetCode:3115. 质数的最大距离(Java 筛质数)

目录 3115. 质数的最大距离 题目描述: 实现代码与解析: 筛质数 原理思路: 3115. 质数的最大距离 题目描述: 给你一个整数数组 nums。 返回两个(不一定不同的)质数在 nums 中 下标 的 最大距离。 示…

Swift中的二分查找:全面指南

Swift中的二分查找:全面指南 简介 二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。 在这篇博客中…

从零到百万用户的扩展之路

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/design-system 设计一个支持数百万用户的系统是极具挑战性的,它是一段需要持续优化和不断改进的旅程。在这篇博客中,我们将构建一个支持单个用…

NC13611 树(dfs序+区间dp)

链接 思路&#xff1a; 容易知道对于同一种颜色的子图一定是仅由该颜色的点连通的。设我们要划分的个数为x&#xff08;x<k&#xff09;&#xff0c;也就是说我们要选出x-1条边&#xff0c;这里有种情况。那么我们需要选出x种颜色&#xff0c;这里有种情况。然后我们需要将…

英国Assignment写作怎么积累经验?

最近很多留学生每天都要熬夜&#xff0c;吓死宝宝了。关键是最后还是会fall了啊&#xff01;其实英国Assignment写作是要靠日积月累的写作经验的&#xff0c;虽然阅读量和写作水平无法一日千里&#xff0c;但是写作技巧却是可以速成的&#xff0c;我们一起来看看吧。 选题定方…

单线服务器有什么作用?

什么是单线服务器&#xff1f;单线服务器是指只有一条物理线路可以接入的服务器&#xff0c;这表明所有的数据信息与用户的访问请求都只能通过这一条线路来进行传输&#xff0c;因此单线服务器在服务器的性能与可扩展性方面有着一定的限制。 单线服务器与双线服务器相比&#x…

双端队列广搜——AcWing 175. 电路维修

双端队列广搜 定义 双端队列广搜&#xff08;Breadth-First Search with a Deque&#xff09;是一种图或树的遍历算法变体&#xff0c;它利用了双端队列&#xff08;Deque&#xff0c;全称Double Ended Queue&#xff0c;允许在其两端进行插入和删除操作&#xff09;作为数据…

1996-2023年各省财政收支数据(无缺失)(地方财政一般预算收入、地方财政一般预算支出)

1996-2023年各省财政收支数据&#xff08;无缺失&#xff09;&#xff08;地方财政一般预算收入、地方财政一般预算支出&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴、 3、指标&#xff1a;地方财政一般预算收入、地方财政一般预算…