日志以及日志封装

news2024/10/6 17:56:09

日志

输出日志信息

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 logging

fmt = '%(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 logging

fmt = '%(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.handlers

class GetLogger:
    logger = None
    @classmethod
    def 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 = driver

    def 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 True
        except:
            log.info("元素{}不存在".format(loc))
            return False
from case_login.tool.get_log import get_logging
from case_login.base.get_logger import GetLogger

log = 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

    @classmethod
    def setUpClass(cls):
        try:
            # 实例化 获取页面对象 PageLogin
            cls.login = PageLogin(GetDriver().get_driver())
            # 点击登录连接
            cls.login.page_click_login_link()
        except Exception as e:
            log.error(e)

    # tearDown
    @classmethod
    def 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.coloradmin.cn/o/1885835.html

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

相关文章

CICD之Git版本管理及基本应用

CICD:持续集成,持续交付--让对应的资料,对应的项目流程更加规范--提高效率 CICD 有很多的工具 GIT就是其中之一 1.版本控制概念与环境搭建 GIT的概念: Git是一款分布式源代码管理工具(版本控制工具) ,一个协同的工具。 Git得其数据更像是一系列微型文件系统的快照。使用Git&am…

Vue 全局状态管理新宠:Pinia实战指南

文章目录 前言全局状态管理基本步骤:pinia 前言 随着Vue.js项目的日益复杂,高效的状态管理变得至关重要。Pinia作为Vue.js官方推荐的新一代状态管理库,以其简洁的API和强大的功能脱颖而出。本文将带您快速上手Pinia,从安装到应用&…

当下环境下如何提升自己以拥抱未来的机会-程序员的自我提升

一、前言 看看今年的行情,无论是国内还是国外,仿佛都没有什么活力,经济下行压力越来越大,企业经营越来越困难。对于程序员的工作机会越来越少。这可能是现阶段乃至几年内的现象。现在是现金为王,拥有其他资产仿佛没有多大的增值空间,经济一片惨淡,消费不活跃,我看到的…

【鸿蒙学习笔记】Column迭代完备

属性含义介绍 Column({ space: 10 }) {Row() {Text(文本描述).size({ width: 80%, height: 60 }).backgroundColor(Color.Red)}.width(90%).height(90).backgroundColor(Color.Yellow) } .width(100%) // 宽度 .height(200) // 高度 .backgroundColor(Color.Pink) // 背景色 .…

汇聚荣拼多多电商如何?

随着互联网技术的飞速发展,电子商务已成为现代商业的重要组成部分。其中,拼多多作为中国领先的电商平台之一,以其独特的社交电商模式迅速崛起,吸引了众多消费者和商家的加入。那么,拼多多电商如何呢?本文将从五个方面…

电路里电源不仅仅是电源

电源往往被认为是直流控制电路中重要的考虑因素之一——但我们也不能忽视其他关键因素:电源滤波器、转换器和备用电源模块。 输入电源是任何电气控制系统的基本配置。没有电源,就没有传感器、控制器、负载设备,什么都没有。因此,…

Three.js 中的光照模型

Three.js 中的光照模型 Three.js 的一个伟大抽象就是统一了所有材质的光照模型, 无论 PBR 或者 Phong。都只用两个函数给全部囊括了。 就是 RE_Direct(直接反射) 和 RE_IndirectDiffuse(间接反射)。真正做到了大一统。下面以Phong为例,具体看一下如何落地。 省流版本: // 直接…

人工智能在音乐创作中的双刃剑:创新与挑战

AI在创造还是毁掉音乐? 简介 最近一个月,轮番上线的音乐大模型,一举将素人生产音乐的门槛降到了最低,并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后,AI产品的版权归属于谁,创意产业要如何在AI的阴…

机器学习实战20-利用AnoSVGD算法探索多指标的异常检测的应用

大家好,我是微学AI,今天给大家介绍一下机器学习实战20-利用AnoSVGD算法探索多指标的异常检测的应用。SVGD(Stein Variational Gradient Descent)是一种通用的变分推断算法,它是优化中梯度下降的自然对应物。SVGD通过应用一种功能性梯度下降来…

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

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

【开发环境】MacBook M2安装git并拉取gitlab项目,解决gitlab出现Access Token使用无效的方法

文章目录 安装Homebrew安装git打开IDEA配置git打开IDEA拉取项目 安装Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"在iTerm等命令行工具打开后,输入上面的命令 之后根据中文提示完成Homebrew的下载…

奇葩公司又发微博了,网友表示“乐”

多益网络 近日,多益网络官方微博发帖,公然表示对法院仲裁结果不服,认为劳动法有极多问题。 大家不要看微博内容似乎振振有词,极有可能只是多益网络单方面的选择性表达,毕竟多益网络的臭名早就家喻户晓。 况且对前员工直…

mybatis、mybatis-plus插件开发,实现数据脱敏功能

首先说一下mybatis中四大组件的作用,下面开发的插件拦截器会使用 四大组件Executor、StatementHandler、ParameterHandler、ResultSetHandler Executor: Executor 是 MyBatis 中的执行器,负责 SQL 语句的执行工作。它通过调度 StatementHan…

蓝桥杯算法双周赛

四、赛后真题解析 比赛赛后将提供免费直播讲解,主讲人:待定。时间:07 月 13 日(比赛当日)晚 21 时。观看直播地址:第3场蓝桥算法季度赛赛后题解直播 - 蓝桥云课 - 哔哩哔哩直播,二次元弹幕直播…

为什么电量传感器在储能BMS应用中如此重要?

在储能系统中电池的充放电状态和使用寿命是保障系统健康稳定持久运行的关键因素,因此建立稳定可靠准确的电量检测方案至关重要。电流传感器在估算和延长电池使用寿命方面发挥着至关重要的作用,是储能电池检测系统中重要的一环。 关键词:电量…

vue选择上下周,拖拽列表,随机背景色

安装拖拽插件 npm install vuedraggable <template><!--排产计划--><div class"app-container"><div class"mainbox"><div class"table-container table-fullscreen"><div class"title-name">…

向openHarmony设备添加gdb调试工具

1. 下载gdb源码 国内从官网下载源码比较慢&#xff0c;可以从清华的镜像网站&#xff08;清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;上下载。下载地址&#xff1a; Index of /gnu/gdb/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择…

喜讯|华院计算认知智能引擎算法平台荣登BPAA大赛创新组TOP50

6月25日&#xff0c;备受瞩目的BPAA第四届全球应用算法模型典范大赛&#xff08;以下简称“BPAA大赛”&#xff09;正式揭晓了《第四届全球应用算法模型典范大赛创业组TOP50榜单》和《第四届全球应用算法模型典范大赛创新组TOP50榜单》。其中&#xff0c;华院计算技术&#xff…

Python课程设计:python制作俄罗斯方块小游戏

基于python的俄罗斯方块小游戏 目录 基于python的俄罗斯方块小游戏 1.概述 1.1 摘要 1.2 开发背景 1.3 开发环境 1.4 实现功能 2.代码描述 2.1 模块导入 2.2 初始化变量 2.3 播放音乐 2.4 创建方块类 2.5 绘制游戏地图 2.6 游戏初始化 2.7 绘制有边框矩形 2.8 …

go使用grpc编辑器 windows

先看最后效果&#xff1a; 当我执行 protoc --go_out. proto.proto 会生成proto.pb.go文件&#xff0c;主要存储的是封装好的结构体 执行 protoc --go-grpc_out. proto.proto 会生成对应的方法 那么现在提供解决方案&#xff1a; https://github.com/protocolbuffers…