看项目时,发现一个性能监控装饰器,感觉挺有意思的。于是借鉴了他的思路,自己重新写了我认为更简洁的代码。

作用:可以放在类上和方法上,如果放在类上,则监控所有方法。根据设置的阈值,判断方法执行是否超时了,如果超时,那么就记录到日志文件当中去。

代码如下:

import logging
import sys
import time
from functools import wraps
from time import sleeplogging.basicConfig(level=logging.INFO,# 时间 日志Logger的名称 级别 信息format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',handlers=[logging.StreamHandler(sys.stdout),  # 控制台输出logging.FileHandler('app.log', 'a')  # 文件输出]
)
logging = logging.getLogger(__name__)# threshold:阈值,默认为1s
def monitor_performance(threshold : int = 1):def decorator(func_or_class):if isinstance(func_or_class, type):  # 处理类装饰器class WrappedClass(func_or_class):# 该方法会拦截访问实例的方法def __getattribute__(self, name):attr = super().__getattribute__(name)# 拦截非私有方法if callable(attr) and not name.startswith("_"):# 保留函数的基础信息@wraps(attr)def wrapped_method(*args, **kwargs):start_time = time.time()res = attr(*args, **kwargs)end_time = time.time()duration = end_time - start_timeif duration > threshold:logging.info(f"{func_or_class.__name__}.{name}耗时{end_time - start_time}s,超过了阈值{threshold}s")return resreturn wrapped_methodreturn attrreturn WrappedClasselse:  # 处理函数装饰器@wraps(func_or_class)def wrapped_method(*args, **kwargs):start_time = time.time()res = func_or_class(*args, **kwargs)end_time = time.time()duration = end_time - start_timeif duration > threshold:logging.info(f"{func_or_class.__name__}耗时{end_time - start_time}s,超过了阈值{threshold}s")return resreturn wrapped_methodreturn decorator# @monitor_performance()
class Person:@monitor_performance()def test(self):sleep(3)print(".........")Person().test()

输出如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915953.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915953.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915953.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt常用控件-05

文章目录qt常用控件-05LineEditTextEditcombo box结语很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c11中常见的新增表达 作者:٩( ‘ω’ )و260 我的专栏:qt&am…

Python进阶知识之pandas库

目录 一、Series:一维带标签的数组 二、DataFrame:二维表格型数据结构 三、Series 的核心操作 四、 DataFrame 的核心操作 五、 索引的特殊用法 六、 loc 与 iloc:DataFrame 的高级查询 七、综合案例 一、Series:一维带标签…

【GIT】基础知识及基本应用

很高兴为您详细介绍Git的相关知识。Git是一个分布式版本控制系统,常用于软件开发中的代码管理和协作。以下是关于Git的一些基础知识:1. 安装和配置安装:Windows:可以从GitHub下载适用于Windows的安装包。MacOS:可以通过…

Maven Scope标签:解锁Java项目依赖管理的秘密武器

一、Maven 与依赖管理简介在 Java 项目开发的庞大体系中,Maven 堪称基石般的存在,发挥着极为关键的作用。它遵循 “约定优于配置” 的理念,让项目的构建过程变得规范有序、结构化且具备良好的重复性 。比如,它强制执行标准的项目结…

IP43半加固笔记本L156H

IP43半加固笔记本L156H 产品特性:● 标配Intel I7-7700HQ 4核8线程处理器 ● 操作系统支持Windows7/10 64bit / Li n u x ● DDR4 16G 高速内存 zui高支持64G ● 全高清显示面板15.6寸,1920X1080 ● 内置海德射频模块SMA接口 ● 工作温度:…

ZooKeeper 是什么?

ZooKeeper 是一个分布式协调服务,由 Apache 基金会开发,专为分布式系统设计。它提供了高可用、高性能、一致性的核心服务,帮助分布式应用解决诸如配置管理、命名服务、分布式锁、集群协调等问题。ZooKeeper 的核心特点:简单易用&a…

Java学习第六十三部分——K8s

目录 📫 一、关键概述 🔍 ​​二、定义起源​​ 🚀 ​​三、核心特点​​ 🏗️ ​​四、核心组件​​ 🧩 ​​五、资源对象​​ ⚡ ​​六、应用场景​​ 🧱 ​​七、Java与K8s 🛠️ ​…

【自用】JavaSE--阶段测试

考试题目第一题(10分)需求目前有100名囚犯,每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号(要求这些囚犯的编号是不能重复的),然后让他们依次站成一排。(注:位置是从…

Vulnhub Matrix-Breakout-2-Morpheus靶机攻略

1.下载靶机 靶机下载地址:https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 下载后使用VM打开,后续选择安装地址开启就算是下载好了 2.主机发现 查看网络适配器模式(NET模式),找到NET…

OpenCV —— 绘制图形

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

RHCE(4)

主:从:

网络安全作业三

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><link rel"style…

深入理解 ThreadLocal:从原理到最佳实践

&#x1f4dd; 前言&#xff1a;为什么你需要了解 ThreadLocal&#xff1f;在多线程并发编程中&#xff0c;线程安全始终是一个绕不开的话题。我们常常需要为每个线程维护一份独立的上下文数据&#xff0c;例如用户信息、事务 ID、日志追踪 ID 等。这些数据不能被多个线程共享&…

AD一张原理图分成多张原理图

先选中你要作为主级原理图的那张原理图&#xff0c;我这里是Sheet1,点击设计&#xff08;D&#xff09;&#xff0c;再点击create sheet symbol from sheet&#xff08;这个不能选错&#xff09;快捷键&#xff1a;DY弹窗中选择要加入的次级原理图左击鼠标放置重复上面的动作&a…

AI大模型资源

网址 https://sass.kupepoem.cn/ 登录-选择模型 打开上述网址后如下操作&#xff1a; 进入后&#xff0c;所有模型均可使用&#xff1a; o4-mini&#xff08;支持Deep Research深入研究&#xff09; 选择o4-mini模型 选择深度研究 要研究什么&#xff0c;对话直接输入即可。…

论文阅读--《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》

好的&#xff0c;这是《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》论文的中文翻译&#xff1a;[文件名称]: Besting_the_Black-Box_Barrier_Zones_for_Adversarial_Example_Defense.pdf [文件内容开始]第 1 页 收稿日期&#xff1a;2021年10月1…

如何保证GPFS文件系统的强一致性

一、底层机制&#xff1a;分布式锁与元数据管理GPFS 通过分布式锁和集中式元数据管理的结合&#xff0c;确保数据和元数据的一致性&#xff1a;集中式元数据服务器&#xff08;MDS&#xff09;GPFS 采用主从架构的元数据管理&#xff0c;由指定节点&#xff08;或集群&#xff…

使用Docker+Nginx部署电商平台项目(服务端+管理端+商城)

1.项目背景&#xff1a; 本项目作为小商场系统&#xff0c;涵盖内容如下&#xff1a; litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端 1.1项目架构&#xff1a; 1.2项目技术栈&#xff1a; 本项目可以使用window运行jar包本地部署&#xff0c…

Java网络编程入门:从基础原理到实践(二)

目录 1. 网络编程基础&#xff1a;搞懂设备通信的底层逻辑 1.1 为啥需要网络编程&#xff1f;—— 让设备 “互通有无” 1.2 什么是网络编程&#xff1f;—— 给数据 “定规矩、找路线” 1.3 网络编程的基本概念&#xff1a;理清通信里的角色和流程 1.3.1 发送端和接收端 …

XSS内容分享

反射型XSS &#xff1a;反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数&#xff08;变量&#xff09;中&#xff0c;如搜索框的反射型XSS。在搜索框中&#xff0c;提交PoC[scriptalert(/xss/)/script]&#xff0c;点击搜索&#xff0c;即可触发…