python 自定义日志器封装(一)

Python自动化测试之自定义日志及其封装 前言: 在软件测试的日常工作中,日志是个非常重要的模块 对于测试来说,日志的作用主要有以下四点: 1.调试程序 2.了解系统程序运行的情况是否正常 3.系统城西运行故障分析和问题定位 4.用来做用户行为分析和数据统计 因此在编写自动化测试脚本和搭建自动化测试框架时,最好加上日志的收集功能,可以通过日志来定位问题。 正文 相关概念 在自定义日志之前,我们需要了解如下信息: 日志收集器 可以理解为用于收集日志信息的容器; 日志级别(Level): 常见的日志级别有:debug、info、warning、err 阅读详情

思路:使用自定义封装日志器进行日志的输出:按单个文件,按文件大小,按时间。如果初始化异常则使用默认日志器

步骤如下:
1. 默认日志器,默认日志器使用按天分割日志
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author  : holidaylzz
# Time    : 2020/5/10

import time
import yaml.scanner
import logging
import logging.config
from logging.handlers import TimedRotatingFileHandler
from core.util.pathUtil import PathUtil


def basic_logger():
    """
    默认日志器
    :return:
    """
    path_util = PathUtil()
    # 在项目中创建日志文件路径,已创建则忽略
    path_util.makedirs('log')
    # 日志格式
    fmt = logging.Formatter('%(asctime)s - %(thread)s - [%(levelname)s] %(pathname)s - %(funcName)s  : %(message)s')
    # 日志等级
    level = logging.INFO
    # 日志器
    logger = logging.getLogger()
    logger.setLevel(level)

    # 使用多个不同等级的handler输出到不同日志文件
    #info handler
    info_filename = path_util.get_project_file_path('log/apiTest.log')
    tft_info_handler = TimedRotatingFileHandler(filename=info_filename, when='midnight', backupCount=10, encoding='UTF-8')
    tft_info_handler.setLevel(logging.INFO)
    tft_info_handler.setFormatter(fmt)
    logger.addHandler(tft_info_handler)

    # error handler
    error_filename = path_util.get_project_file_path('log/apiTest_error.log')
    tft_error_handler = TimedRotatingFileHandler(filename=error_filename, when='midnight', backupCount=10, encoding='UTF-8')
    tft_error_handler.setLevel(logging.ERROR)
    tft_error_handler.setFormatter(fmt)
    logger.addHandler(tft_error_handler)

    # warn handler
    warn_filename = path_util.get_project_file_path('log/apiTest_warn.log')
    tft_warn_handler = TimedRotatingFileHandler(filename=warn_filename, when='midnight', backupCount=10, encoding='UTF-8')
    tft_warn_handler.setLevel(logging.WARN)
    tft_warn_handler.setFormatter(fmt)
    logger.addHandler(tft_warn_handler)

    return logger
2.自定义日志器封装

1.自定义日志器封装类

#  和上面的代码放在同一个文件logger.py
class Logger(object):

    def __init__(self, logger_name="timedRotatingFile_module"):
        """
        日志器初始化
        :param logger_name:默认使用timedRotatingFile_module
        """
        log_conf = 'logging.yml'
        try:
            # read logging.yml
            with open(log_conf, 'rt') as f:
                config = yaml.safe_load(f.read())

            logging.config.dictConfig(config)
            self.__logger = logging.getLogger(logger_name)
        # 异常处理,出现异常使用默认日志器,进行日志输出
        except FileNotFoundError as e:
            self.__logger = basic_logger()
            self.__logger.exception(e)
        except yaml.scanner.ScannerError as e:
            self.__logger = basic_logger()
            self.__logger.exception(e)
        except (ValueError, TypeError, AttributeError, ImportError) as e:
            self.__logger = basic_logger()
            self.__logger.error('logger config error!')
            self.__logger.exception(e)
        except Exception as e:
            self.__logger = basic_logger()
            self.__logger.exception(e)

    @property
    def logger(self):
        """
        返回日志器
        :return:
        """
        return self.__logger

2.logging.yml配置文件

# version must be 1
# logger配置文件
#########################################logging yaml profile##################################################

version: 1
disable_existing_loggers: False
formatters:
        simple:
            format: "%(asctime)s - %(thread)s - [%(levelname)s] %(pathname)s - %(funcName)s  : %(message)s"
#filters:
handlers:
    console:
            class: logging.StreamHandler
            level: DEBUG
            formatter: simple
            stream: ext://sys.stdout
    info_file_handler:
            class: logging.FileHandler
            level: INFO
            formatter: simple
            filename: ../../../log/apiTest.log
            encoding: utf8
    error_file_handler:
            class: logging.FileHandler
            level: ERROR
            formatter: simple
            filename: ../../../log/apiTest_error.log
            encoding: utf8
    warn_file_handler:
            class: logging.FileHandler
            level: WARN
            formatter: simple
            filename: ../../../log/apiTest_warn.log
            encoding: utf8
    info_file_timedRotatingFileHandler:
            class: logging.handlers.TimedRotatingFileHandler
            level: INFO
            formatter: simple
            filename: ../../../log/apiTest.log
            when: 'midnight'
            backupCount: 20
            encoding: utf8
    error_file_timedRotatingFileHandler:
            class: logging.handlers.TimedRotatingFileHandler
            level: ERROR
            formatter: simple
            filename: ../../../log/apiTest_error.log
            when: 'midnight'
            backupCount: 20
            encoding: utf8
    warn_file_timedRotatingFileHandler:
            class: logging.handlers.TimedRotatingFileHandler
            level: WARN
            formatter: simple
            filename: ../../../log/apiTest_warn.log
            when: 'midnight'
            backupCount: 20
            encoding: utf8
    info_file_rotatingFileHandler:
            class: logging.handlers.RotatingFileHandler
            level: INFO
            formatter: simple
            filename: ../../../log/apiTest.log
            maxBytes: 2147483648
            backupCount: 20
            encoding: utf8
    error_file_rotatingFileHandler:
            class: logging.handlers.RotatingFileHandler
            level: ERROR
            formatter: simple
            filename: ../../../log/apiTest_error.log
            maxBytes: 2147483648
            backupCount: 20
            encoding: utf8
    warn_file_rotatingFileHandler:
            class: logging.handlers.RotatingFileHandler
            level: WARN
            formatter: simple
            filename: ../../../log/apiTest_warn.log
            maxBytes: 2147483648
            backupCount: 20
            encoding: utf8
loggers:
    file_module:
            level: INFO
            handlers: [info_file_handler,error_file_handler,warn_file_handler]
            propagate: no
    timedRotatingFile_module:
            level: INFO
            handlers: [info_file_timedRotatingFileHandler,error_file_timedRotatingFileHandler,warn_file_timedRotatingFileHandler]
            propagate: no
    rotatingFile_module:
            level: INFO
            handlers: [info_file_rotatingFileHandler,error_file_rotatingFileHandler,warn_file_rotatingFileHandler]
            propagate: no
root:
    level: INFO
    handlers: [console]


3. 自测
def func(num):
    try:
        ret = num+1/num
        return ret
    except Exception as e:
        logger.exception(e)


if __name__ == '__main__':
    logger = Logger().logger
    try:
        for i in range(10):
            data = func(i)
            logger.info(data)
    except Exception as e:
        logger.exception(e)

输出结果:

生成3个日志文件:info,error,warn

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中为了适应项目部署,减少绝对路径配置的麻烦,使用自己写的路径处理工具类,使用项目根目录与日志目录拼接做为日志的绝对路径。

import sys
import os


class PathUtil(object):
    """路径处理工具类"""

    def __init__(self):
        # 判断调试模式
        # Python获得一些有关系统的各种信息的时候就不得不想到os的environ()
        debug_vars = dict((a, b) for a, b in os.environ.items() if a.find('IPYTHONENABLE') >= 0)

        # 根据不同场景获取根目录
        if len(debug_vars) > 0:
            # 当前为debug运行时
            self.rootPath = sys.path[2]
        elif getattr(sys, 'frozen', False):
            # 当前为exe运行时
            self.rootPath = os.getcwd()
        else:
            # 正常执行
            self.rootPath = sys.path[1]

        # 替换斜杠
        self.rootPath = self.rootPath.replace("\\", "/")

    def get_project_file_path(self, filename):
        """
        项目根目录拼接文件项目路径 ,如 logs/default.log
        :param filename: 文件项目路径, logs/default.log
        :return:
        """
        filePath = '%s/%s' % (self.rootPath, filename)
        return filePath

    def makedirs(self, directory):
        """
        在项目中创建文件路径,已创建则忽略
        :param directory:项目文件目录
        :return:
        """
        realPath = '%s/%s' % (self.rootPath, directory)
        os.makedirs(realPath, exist_ok=True)

写的不好和有问题的地方请多多指教!
笔芯~

python 封装自己的log日志系统 封装记录log日志,多模块使用 # coding=utf-8 import logging import time import os log_path = './log' class Log: def __init__(self): self.now = time.strftime("%Y-%m-%d--%H-%M-%S") self.logna... 阅读详情

相关推荐

python 日志封装

日志功能描述:写python项目时,需要用到日志类,需求为:日志信息可配置,提供几种类型不同的配置,并且日志既可以写到文本也可以写到数据库中。 实现时日志类直接使用python的logging,配置信息写到配置文件logging_data.conf,并使用logging.config.fileConfig(log_config_path)加载配置。写日志到数据库参考了log4mongo-1.6.0

sunny_ss12的专栏 5148

easylogging++日志库使用手册

Easylogging++是通过源码文件来集成的跨平台日志库,使用起来非常方便,优点是使用方便,速度快,线程安全,可配置。EasyLogging++日志库只有两个文件,一个头文件一个代码文件拷贝到项目工程中就可以使用。

yang1fei2的博客 2566

【C++】开源:跨平台轻量日志库easyloggingpp

easyloggingpp日志库

DevFrank的博客 3万+

日志类Logger-easyloggingpp封装及应用

之前介绍过第三方开源库easyloggingpp,下面介绍我封装的一个logger类,方便使用。 1.类源码 //logger.h #ifndef LOGGER_H #define LOGGER_H #include "easylogging++.h" #define logde LOG(DEBUG) #define loger LOG(ERROR) #define logfa LOG(FATAL) class Logger { public: explicit Logger().

yingge的专栏 1392

easyloggingpp:单头C ++日志记录库。 它功能强大,可扩展,重量轻,性能快,线程和类型安全,并且具有许多内置功能。 它提供了以您自己的自定义格式编写日志的功能。 它还为记录您的类,第三方库,STL和第三方容器等提供支持

easyloggingpp:单头C ++日志记录库。 它功能强大,可扩展,重量轻,性能快,线程和类型安全,并且具有许多内置功能。 它提供了以您自己的自定义格式编写日志的功能。 它还为记录您的类,第三方库,STL和第三方容器等提供支持

Qt-利用easyloggingpp库打印日志

关于easyloggingpp的库,包含qt c c#编译例子

python dictConfig封装自定义日志器优化(三)

之前使用dictConfig写了自定义日志器的封装,但感觉不是很好,责任划分不明确,边在实践中进行优化,把日志的一部分配置(如日志文件名、路径等)摘出来放在项目配置文件中,其他配置依旧放在yaml文件中维护。 如有不对或可优化的点,欢迎指出! 日志器封装demo 1. 从项目配置文件中读取日志相关配置内容 content of src __init__.py # content of src __init__.py # -*- coding: utf-8 -*- # @Time : 2020.

Holidayzz的博客 805

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2906

python dictConfig封装自定义日志器(二)

之前写的自定义日志器存在不完善,现在进行自定义日志器优化: 读取yaml日志配置文件 更改日志配置路径 使用logging.config.dictConfig配置日志 获取Logger进行使用 代码展示 # version must be 1 # logger配置文件 #########################################logging yaml profile################################################## vers.

Holidayzz的博客 919

极简JEPA世界模型实战:低门槛复现LeWorldModel,CPU可跑

这次我们来看一个能让普通开发者真正上手跑起来的“世界模型”项目。如果你对Yann LeCun提出的JEPA(联合嵌入预测架构)框架感兴趣,但又苦于Meta官方实现过于庞大复杂,那么这个GitHub上4k star的项目就是为你准备的。它用极简的PyTorch代码(核心文件仅160-278行)完整复刻了包括LeWorldModel在内的五个JEPA核心变体,最大的亮点是: 门槛极低,普通笔记本甚至CPU就能跑,显存占用友好,非常适合学习和原理验证。 这个项目名为 keon/jepa ,完全开源。它剥离了工业级

weixin_29031161的博客 421

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 329

【测试开发】Python—logging日志封装

python日志模块,可以说在工程项目中应该很广泛,本文简单地介绍Logging封装模块的编写及使用。当前环境:python 3.6.8;编译环境:pycharm。

尹煜的博客 6010

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3316

python之logging日志封装

第二节–python自动化测试日志封装 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:这个章节主要介绍python中使用logging自己进行一个简单的日志封装 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录第二节--python自动化测试日志封装一、日志logging的简单介绍二、日志的步骤讲解1.控制台日志输出2.文件日志输出3、日志的封装总结 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 一、日志

weixin_43977279的博客 4875

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

直流耦合系统介绍

参考《SMA如何使用直流耦合技术实现更高效的光伏电站-白皮书》

圆桌骑士的博客 732

python封装日志类

日志在编写代码的时候会要经常遇到的,做自动化测试的时候也需要查看日志,所以需要了解python封装日志的方式。 python的日志等级是:CRITICAL>ERROR>WARNING>INFO>DEBUG 默认的等级是WARNING,设置了等级,就只会输出大于等于设置等级的 比如logger.setLevel(level=logging.DEBUG),那么五种级别的都会打印 如果logger.setLevel(level=logging.ERROR),那么只会打印error和cri

shenshenruoxi的博客 1537

新能源汽车电池及充电原理详解

本文详细介绍了新能源汽车的电池包结构、铅酸电池充放电原理,以及交流和直流充电的工作原理和优缺点。内容涵盖电池串联并联原因、充电设备如车载充电机、交流充电桩和直流充电桩的介绍,以及不同充电模式的连接方式。通过对充电过程的深入探讨,有助于读者理解新能源汽车的充电技术。

让你爱上电路设计 4525

python日志logging封装

方式一:封装代码 import logging, logging.handlers, time, os class Log(object): ''' logging的初始化操作,以类封装的形式进行 ''' def __init__(self): # 定义对应的程序模块名name,默认为root self.logger = l...

shuiganjiuying11的博客 3424

基于改进YOLO11的天际线检测算法:复杂光照与恶劣天气适配实战

针对特定任务的YOLO改进,不应追求通用SOTA,而应深入理解任务的物理退化机理。Retinex对应光照模型、FAD对应散射模型、Wise-IoU对应边界不确定性——每个改进都有明确的物理解释,而非盲目的模块堆叠。时序一致性:引入轻量级RNN/Transformer模块利用视频帧间信息补偿单帧退化;多模态融合:结合红外/NIR波段穿透雾霾,与可见光特征在FAD-Neck中交叉注意力融合;自监督预训练:在海量无标注天际线视频上用MAE预训练Backbone,缓解恶劣天气标注稀缺问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 95

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Pytest 封装logging自定义日志等级 —— Python 实践

在做自动化测试、接口服务或者后台系统开发时,日志是我们排查问题、了解程序运行状态不可或缺的工具。Python 内置的 logging 模块功能已经很强大,但在实际项目中直接使用,常常会出现配置重复、日志输出不统一、文件管理混乱等问题。 为了提升效率和可维护性,我们通常会对 logging 进行封装。本文就带你一步步实现一个结构清晰、功能完善的日志模块,支持日志等级控制、自动轮转、控制台与文件分别输出,并通过单例模式确保全局只使用一个日志实例,避免资源浪费和冲突。

weixin_43932100的博客 1240

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python自动化框架-日志模块二次封装

主要思路为定义一个类如LogUtil,并将定义好的logger作为其属性,再将logger.info等日志打印方法封装在类中为info,即可通过LogUtil().info('mesg')的方式在框架中使用封装好的日志模块。根据上述四部设置好以后,即可通过logger.info('mesg')打印所需的日志到文件及控制台。一.日志模块的使用主要包括以下四部分。1.创建日志器并设置输出级别。3.为处理器设置格式及级别。4.为日志器添加处理器。

weixin_44878601的博客 733

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python基础之logging日志模块封装

  引言   使用python做自动化测试的时候,对于关键信息输出和记录是必要的,方便调试和记录查找。python有个logging模块,我们简单对其进行封装。   设计流程   话不多说,流程图已经画,自己领会。   源码    """ 封装log方法 """ import os import time import logging.handlers # 日志打印等级...

像蚂蚁一样工作,像蝴蝶一样生活 3377

python操作日志的封装

前言 曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的, 但是我就是靠着这篇文章入门的logging,所以我觉得没必要再继续说些理论的东西,今天就简单的对日志做个封装,实际工作中直接拿去用吧 方法1 """ ------------...

dengying1836的博客 501

自动化测试-自定义日志类及日志封装(实战)

在自定义日志之前,需要了解如下信息:日志收集器:可以理解为用于收集日志信息的容器;日志级别(Level):DEBUG、INFO、WARNING、ERROR以及CRITICAL输出渠道(Handle):控制台输出,StreamHandle将日志信息保存在文件中:FileHandle日志格式(Format):一般包含如下信息:日志时间-日志名称-日志级别名称-文件名称-行号-日志信息等# 设置日志的输出格式说明:在logging模块。

okcross0的博客 873

自动化框架之Python日志模块二次封装技巧分享

前言: 在我们做测试自动化框架设计的时候,需要对日志模块进行二次开发,以方便我们后面进行关键日志记录和报错日志排查,本章主要分享我在对日志做二次封装过程中的一些小技巧和方法 一、logging模块简介 logging日志模块与print的区别: ① logging可以设置不同的日志级别 ② 可以指定如何输出及输出的位置应用场景:当需要看大量的地方或者在一个文件中查看的时候,这时print不太方便,所以python引入了logging模块来记录我想要的信息 ③ logging相对print来...

weixin_47614014的博客 3166
上一篇: Python AES/CBC/PKCS5Padding加解密
下一篇: Jmeter beanshell语法
Holidayzz
博客等级 码龄9年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值