基于aop实现接口访问的监控记录
2023-04-18 16:11:13 时间
此次实践基于spring boot 2.4.1
相关pom
<!-- aop 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
监控配置类
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 接口监控
**/
@Aspect
@Component
public class LogAspect {
/**
* 配置监控的地址 注:这里配置的是controller的路径
*/
@Pointcut("execution(public * com.batata.continuing.web.*..*(..))")
public void methodPointCut() {
}
@Around("methodPointCut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Signature signature = pjp.getSignature();
Long startTime = null; // 开始时间
Long endTime = null; // 结束时间
//被代理的类的类名
String className = pjp.getTarget().getClass().getName();
//方法名
String methodName = signature.getName();
//获取日志
Logger logger = LoggerFactory.getLogger(className);
//参数数组
Object[] requestParams = pjp.getArgs();
StringBuffer sb = new StringBuffer();
for (Object requestParam : requestParams) {
if (requestParam != null) {
sb.append(JSON.toJSONString(requestParam));
sb.append(",");
}
}
String requestParamsString = sb.toString();
// 去除最后一个逗号
if (requestParamsString.length() > 0) {
requestParamsString = requestParamsString.substring(0, requestParamsString.length() - 1);
}
//接口应答前打印日志
logger.info(String.format("【%s】类的【%s】方法,请求参数:%s", className, methodName, requestParamsString));
//接口调用开始响应起始时间
startTime = System.currentTimeMillis();
//正常执行方法
Object response = pjp.proceed();
//接口调用结束时间
endTime = System.currentTimeMillis();
//接口应答之后打印日志
logger.info(String.format("【%s】类的【%s】方法,应答参数:%s", className, methodName, JSON.toJSONString(response)));
//接口耗时
logger.info(String.format("接口【%s】总耗时(毫秒):%s", methodName, (endTime - startTime)));
return response;
}
}
调用接口进行测试
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击