背景:
我们可能希望对项目中的接口性能进行监控,例如:接口调用时间,开始时间,结束时间,传入的参数等等,通常的做法是在接口代码开始处记录startTime,结尾处记录endTime,然后计算startTime和endTime之差,这种做法无法把这部分日志单独拆分成文件,而且冗余代码会比较多。可以考虑使用spring切面和环绕通知来打印这部分日志,并使用log4j2将这部分日志单独拆分出来。
ps:拆分的出来的日志可以考虑使用shell脚本和awk命令来进行日志分析,将一些关键的数据存库,然后使用echarts来分析来展示图表,就可以成为一个小型的接口监控系统,使用linux的crontab来定时执行脚本,每天刷新数据。
技术点:spring 注解式切面和环绕通知
使用的项目:工作流、规则引擎
具体实现(以规则引擎为例):
1.在rpc-impl层新增PerformenceMonitor类(名字可以随便起)
复制代码
2.spring-context xml文件中新增aspectJ自动代理和aop的引用
复制代码
3.配置异步日志:
在log4j2.xml文件中进行如下配置:
4.本地启动项目,postman调用哪个接口测试:
ps:拆分的出来的日志可以考虑使用shell脚本和awk命令来进行日志分析,将一些关键的数据存库,然后使用echarts来分析来展示图表,就可以成为一个小型的接口监控系统,使用linux的crontab来定时执行脚本,每天刷新数据。
技术点:spring 注解式切面和环绕通知
使用的项目:工作流、规则引擎
具体实现(以规则引擎为例):
1.在rpc-impl层新增PerformenceMonitor类(名字可以随便起)
- package com.yixin.ndss.common.aop;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.apache.logging.log4j.Level;
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Pointcut;
- import org.springframework.stereotype.Component;
- import com.yixin.common.utils.JsonObjectUtils;
- /**
- * 监控方法的执行时间
- *
- * <p>
- *
- * Package : com.yixin.common.system.ioc
- *
- * @author YixinCapital -- shaoml
- * 2016年10月20日 下午6:55:45
- *
- */
- @Aspect
- @Component
- public class PerformenceMonitor {
-
- private static final Logger LOGGER = LogManager.getLogger(PerformenceMonitor.class);
-
- /**
- * 切点监控com.yixin.wfpt.api.process.impl包的所有public方法
- *
- * @author YixinCapital -- shaoml
- * 2017年4月26日 上午9:55:31
- */
- @Pointcut("execution(* com.yixin.ndss.application.api.impl..*(..))")
- private void pointCutMethod() {
-
- }
-
- /**
- * 声明环绕通知
- *
- * @param pjp 代理对象
- * @return Object 方法调用出参
- * @throws Throwable
- * @author YixinCapital -- shaoml
- * 2017年4月26日 上午9:55:16
- */
- @Around("pointCutMethod()")
- public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
-
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- // 执行方法开始时间
- long begin = System.currentTimeMillis();
- String beginStr = sdf.format(new Date(begin));
-
- Object obj = pjp.proceed();
-
- // 入参拦截
- Object[] args = pjp.getArgs();
-
- // 执行方法结束时间
- long end = System.currentTimeMillis();
- String endStr = sdf.format(new Date(end));
-
- LOGGER.log(Level.forName("CAP", 460),
- "======调用" + pjp.getTarget().getClass().getSimpleName()
- + "类中方法: " + pjp.getSignature().getName()
- + "(), 开始时间: " + beginStr + ", 结束时间: " + endStr + ", 总耗时: " + (end - begin) + "ms,"
- + "入参=【" + JsonObjectUtils.objectToJson(args) + "】, 出参=【" + JsonObjectUtils.objectToJson(obj) + "】");
-
- return obj;
- }
-
- }
2.spring-context xml文件中新增aspectJ自动代理和aop的引用
3.配置异步日志:
在log4j2.xml文件中进行如下配置:
2.png
4.本地启动项目,postman调用哪个接口测试: