最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Loguru日志封裝裝飾器實現(xiàn)過程

 更新時間:2024年03月01日 11:51:56   作者:搬磚路上的大馬猴  
這篇文章主要介紹了Python Loguru日志封裝裝飾器實現(xiàn)過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

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配置中的數(shù)據(jù)
    logger_h = logger.opt(colors=True)
    def __new__(cls, *args, **kwargs):
        # hasattr是Python的一個內(nèi)置函數(shù),用于檢查對象是否具有指定的屬性或方法。
        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  # 使用自定義過濾器函數(shù)
        )
    # @staticmethod
    # def _debug_filter(record):
    #     """自定義過濾器函數(shù),僅輸出 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: 要輸出的內(nèi)容
        :return: msg
        # 栗子
        MyLogs.log("info", "-----------分割線-----------")
        """
        getattr(cls.logger_h, level)(msg)
    @classmethod
    def log_decorator(cls, msg: str):
        """
         日志裝飾器,記錄函數(shù)的名稱、參數(shù)、返回值、運行時間和異常信息
         栗子:
            @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))  # 使用正則表達式替換<任意內(nèi)容>為\<任意內(nèi)容>
                kwargs_str = re.sub(r"<([^<>]+)>", r"\<\1\>", str(kwargs))  # 使用正則表達式替換<任意內(nèi)容>為\<任意內(nèi)容>
                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日志封裝 - 裝飾器實現(xiàn)的文章就介紹到這了,更多相關Python Loguru日志封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用Python將圖片中扭曲矩形的復原

    利用Python將圖片中扭曲矩形的復原

    這篇文章主要給大家介紹了關于如何利用Python將圖片中扭曲矩形復原的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • selenium中常見的表單元素操作方法總結

    selenium中常見的表單元素操作方法總結

    Selenium可以驅(qū)動瀏覽器來執(zhí)行一些操作,也就是說可以讓瀏覽器模擬執(zhí)行一些動作,下面這篇文章主要給大家介紹了關于selenium中常見的表單元素操作方法,需要的朋友可以參考下
    2022-02-02
  • Pycharm2017版本設置啟動時默認自動打開項目的方法

    Pycharm2017版本設置啟動時默認自動打開項目的方法

    今天小編就為大家分享一篇Pycharm2017版本設置啟動時默認自動打開項目的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python修改字典內(nèi)key對應值的方法

    python修改字典內(nèi)key對應值的方法

    這篇文章主要介紹了python修改字典內(nèi)key對應值的方法,涉及Python中字典賦值的相關實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • pandas讀取Excel批量轉(zhuǎn)換時間戳的實踐

    pandas讀取Excel批量轉(zhuǎn)換時間戳的實踐

    本文主要介紹了pandas讀取Excel批量轉(zhuǎn)換時間戳的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python創(chuàng)建一個自定義視頻播放器的實現(xiàn)

    Python創(chuàng)建一個自定義視頻播放器的實現(xiàn)

    本文主要介紹了Python創(chuàng)建一個自定義視頻播放器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • pytorch下tensorboard的使用程序示例

    pytorch下tensorboard的使用程序示例

    我們都知道tensorflow框架可以使用tensorboard這一高級的可視化的工具,這篇文章主要介紹了pytorch下tensorboard的使用,需要的朋友可以參考下
    2021-10-10
  • Python3使用requests發(fā)閃存的方法

    Python3使用requests發(fā)閃存的方法

    requests是一個python 輕量的http客戶端庫,相比python的標準庫要優(yōu)雅很多。接下來通過本文給大家介紹Python3使用requests發(fā)閃存的方法,感興趣的朋友一起學習吧
    2016-05-05
  • 手把手帶你了解python多進程,多線程

    手把手帶你了解python多進程,多線程

    這篇文章主要介紹了python多線程與多進程及其區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • Python實現(xiàn)計算最小編輯距離

    Python實現(xiàn)計算最小編輯距離

    這篇文章主要介紹了Python實現(xiàn)計算最小編輯距離的相關代碼,有需要的小伙伴可以參考下
    2016-03-03

最新評論

仙游县| 万荣县| 威宁| 大足县| 高青县| 江源县| 莲花县| 荥经县| 淳安县| 翁源县| 冕宁县| 浙江省| 乌鲁木齐市| 桃江县| 赫章县| 腾冲县| 县级市| 抚松县| 海南省| 沅陵县| 平塘县| 扬州市| 泰兴市| 花垣县| 古田县| 长治县| 新泰市| 石嘴山市| 莫力| 宝丰县| 平顺县| 桐柏县| 抚顺县| 宜都市| 崇左市| 太仓市| 奇台县| 嘉峪关市| 扶余县| 鄄城县| 金溪县|