网站开发主要内容,免费商城平台,大连 手机网站案例,做百度推广是网站好还是阿里好看项目时#xff0c;发现一个性能监控装饰器#xff0c;感觉挺有意思的。于是借鉴了他的思路#xff0c;自己重新写了我认为更简洁的代码。作用#xff1a;可以放在类上和方法上#xff0c;如果放在类上#xff0c;则监控所有方法。根据设置的阈值#xff0c;判断方法执…看项目时发现一个性能监控装饰器感觉挺有意思的。于是借鉴了他的思路自己重新写了我认为更简洁的代码。作用可以放在类上和方法上如果放在类上则监控所有方法。根据设置的阈值判断方法执行是否超时了如果超时那么就记录到日志文件当中去。代码如下
import logging
import sys
import time
from functools import wraps
from time import sleeplogging.basicConfig(levellogging.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()
输出如下