Python Loguru日志封装装饰器实现过程

 更新时间:2024年03月01日 11:51:56   作者:搬砖路上的大马猴  
这篇文章主要介绍了Python Loguru日志封装装饰器实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

Python Loguru日志封装

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# @Time    : 2023/6/25 15:49
# @Author  : jingang.hou082613@gmail.com
# @Site    : 
# @File    : operateLogs.py
# @Software: PyCharm
""" 日志处理 """
import inspect
import os
import re
import sys
from functools import wraps
from time import strftime
from time import perf_counter
from base.singletonModel import Singleton
from loguru import logger
from utils.operateFile._ini import IniFile
class MyLogs(metaclass=Singleton):
    LOG_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../logs")  # 存放日志
    INI_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../config/log_config.ini")  # ini配置文件
    ini_data = IniFile(INI_DIR).get_itemsAll()  # 获取ini配置中的数据
    logger_h = logger.opt(colors=True)
    def __new__(cls, *args, **kwargs):
        # hasattr是Python的一个内置函数,用于检查对象是否具有指定的属性或方法。
        if not hasattr(cls, '_logger'):
            cls._setup_logger()
        return super().__new__(cls)
    @classmethod
    def _setup_logger(cls):
        logger.remove()
        # 设置日志文件路径和格式
        filename = strftime("%Y%m%d-%H%M%S")
        log_file_path = os.path.join(cls.LOG_DIR, f'{filename}.log')
        log_format = "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | " \
                     "<level>{level}</level> " \
                     "| <level>{message}</level>"
        level_: str = MyLogs.ini_data["level"]
        rotation_: str = MyLogs.ini_data["rotation"]
        # 添加日志处理器:写入文件
        cls.logger_h.add(log_file_path,
                         enqueue=True,
                         backtrace=True,
                         diagnose=True,
                         encoding="utf8",
                         rotation=rotation_
                         )
        # 添加日志处理器:控制台输出
        cls.logger_h.add(
            sys.stderr,
            format=log_format,
            enqueue=True,
            colorize=True,
            backtrace=True,
            diagnose=True,
            level=level_,
            # filter=cls._debug_filter  # 使用自定义过滤器函数
        )
    # @staticmethod
    # def _debug_filter(record):
    #     """自定义过滤器函数,仅输出 DEBUG 级别的日志"""
    #     if record["level"].name == MyLogs.ini_data["filter_level"]:
    #         return True
    #     return False
    @classmethod
    def log(cls, level: str, msg: str):
        """
        ···
        :param level: 日志等级:info,debug,trace,error,warning,critical,exception
        :param msg: 要输出的内容
        :return: msg
        # 栗子
        MyLogs.log("info", "-----------分割线-----------")
        """
        getattr(cls.logger_h, level)(msg)
    @classmethod
    def log_decorator(cls, msg: str):
        """
         日志装饰器,记录函数的名称、参数、返回值、运行时间和异常信息
         栗子:
            @log.log_decorator("这里填写def功能")
                def test_zero_division_error(a, b):
                    return a / b
         """
        def decorator(func):
            func_line = inspect.currentframe().f_back.f_lineno
            @wraps(func)
            def wrapper(*args, **kwargs):
                # 处理报错:args中<>被识别为颜色标签而报错
                args_str = re.sub(r"<([^<>]+)>", r"\<\1\>", str(args))  # 使用正则表达式替换<任意内容>为\<任意内容>
                kwargs_str = re.sub(r"<([^<>]+)>", r"\<\1\>", str(kwargs))  # 使用正则表达式替换<任意内容>为\<任意内容>
                cls.log("info", "\n")
                cls.log("info", "<green>-----------分割线-----------</>")
                cls.log("info", f"<white>{msg}  ↓↓↓</>")
                cls.log("debug",
                        f'<red>{func.__qualname__}:{func.__name__}:{func_line} |</>  <white> args: {args_str}, kwargs:{kwargs_str}</>')
                start = perf_counter()
                try:
                    result = func(*args, **kwargs)
                    result_str = re.sub(r"<([^<>]+)>", r"\<\1\>", str(result))
                    end = perf_counter()
                    duration = end - start
                    cls.log("debug",
                            f"<red>{func.__qualname__}:{func.__name__}:{func_line} |</>  <white> 返回结果:{result_str}, 耗时:{duration:4f}s</>")
                    return result
                except Exception as e:
                    cls.log("exception", f"<red>{func.__qualname__}:{func.__name__}:{func_line} |</>: {msg}:报错 :{e}")
                    sys.exit(1)
                finally:
                    cls.logger_h.complete()
                    cls.log("info", "<green>-----------分割线-----------</>")
            return wrapper
        return decorator
MyLogs()
if __name__ == '__main__':
    MyLogs.log("debug", "Executing step 3 of the algorithm")
    MyLogs.log("info", "Server started on port")
    MyLogs.log("warning", "Invalid input provided, using default values")
    MyLogs.log("error", "Invalid user input detected, unable to proceed")
    MyLogs.log("critical", "Database connection lost, terminating the application")
    MyLogs.log("exception", "exception connection lost, terminating the application")
    @MyLogs.log_decorator("1111111111111111111")
    def A(a, b):
        a / b
    A(1, 0)

输出结果:

到此这篇关于Python Loguru日志封装 - 装饰器实现的文章就介绍到这了,更多相关Python Loguru日志封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 不以科学计数法输出的方法

    python 不以科学计数法输出的方法

    今天小编就为大家分享一篇python 不以科学计数法输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python实现疫苗接种管理数据库步骤详解

    Python实现疫苗接种管理数据库步骤详解

    这篇文章主要为大家介绍了Python实现疫苗接种管理数据库步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 用Python Flask创建简洁高效的URL短链接服务

    用Python Flask创建简洁高效的URL短链接服务

    本文介绍了如何使用Python Flask框架创建URL短链接服务。通过详细的步骤和代码示例,读者将学会如何搭建一个高效的URL缩短服务,包括生成短链接、重定向、还原长链接等功能。本文还介绍了如何使用Redis数据库实现短链接的存储和管理和如何优化短链接的访问速度和可靠性
    2023-04-04
  • 利用Python实现定时程序的方法

    利用Python实现定时程序的方法

    在 Python 中,如何定义一个定时器函数呢?本文主要介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • python中numpy.dot()计算矩阵相乘

    python中numpy.dot()计算矩阵相乘

    本文主要介绍了python中numpy.dot()计算矩阵相乘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • python导出hive数据表的schema实例代码

    python导出hive数据表的schema实例代码

    这篇文章主要介绍了python导出hive数据表的schema实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python通过opencv实现图片裁剪原理解析

    python通过opencv实现图片裁剪原理解析

    这篇文章主要介绍了python通过opencv实现图片裁剪原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • python35种绘图函数详细总结

    python35种绘图函数详细总结

    Python有许多用于绘图的函数和库,比如Matplotlib,Plotly,Bokeh,Seaborn等,这只是一些常用的绘图函数和库,Python还有其他绘图工具,如Pandas、ggplot等,选择适合你需求的库,可以根据你的数据类型、图形需求和个人偏好来决定,本文给大家总结了python35种绘图函数
    2023-08-08
  • Python程序退出方式小结

    Python程序退出方式小结

    这篇文章主要介绍了Python程序退出方式小结,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • Python中关于面向对象概念的详细讲解

    Python中关于面向对象概念的详细讲解

    要了解面向对象我们肯定需要先知道对象到底是什么玩意儿。关于对象的理解很简单,在我们的身边,每一种事物的存在都是一种对象。总结为一句话也就是:对象就是事物存在的实体
    2021-10-10

最新评论