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

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

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

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()
        # 設(shè)置日志文件路徑和格式
        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中<>被識別為顏色標(biāo)簽而報錯
                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> 返回結(jié)果:{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)

輸出結(jié)果:

到此這篇關(guān)于Python Loguru日志封裝 - 裝飾器實現(xiàn)的文章就介紹到這了,更多相關(guān)Python Loguru日志封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python將圖片中扭曲矩形的復(fù)原

    利用Python將圖片中扭曲矩形的復(fù)原

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

    selenium中常見的表單元素操作方法總結(jié)

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

    Pycharm2017版本設(shè)置啟動時默認(rèn)自動打開項目的方法

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

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

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

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

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

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

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

    pytorch下tensorboard的使用程序示例

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

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

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

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

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

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

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

最新評論

沙雅县| 双峰县| 昭平县| 甘肃省| 泗洪县| 通河县| 三门峡市| 芦山县| 涪陵区| 邵武市| 象州县| 安溪县| 沭阳县| 新竹市| 龙陵县| 松潘县| 河源市| 广水市| 上高县| 闽清县| 根河市| 永平县| 佳木斯市| 牡丹江市| 台江县| 湖北省| 久治县| 新兴县| 金华市| 古交市| 偃师市| 高陵县| 辉县市| 泽库县| 罗山县| 芦山县| 双柏县| 内乡县| 报价| 平度市| 曲靖市|