利用注解式切面单独打印接口调用日志
2018-03-22 09:13
531 查看
背景:我们可能希望对项目中的接口性能进行监控,例如:接口调用时间,开始时间,结束时间,传入的参数等等,通常的做法是在接口代码开始处记录startTime,结尾处记录endTime,然后计算startTime和endTime之差,这种做法无法把这部分日志单独拆分成文件,而且冗余代码会比较多。可以考虑使用spring切面和环绕通知来打印这部分日志,并使用log4j2将这部分日志单独拆分出来。
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 (30.13 KB, 下载次数: 0)下载附件2017-7-25 16:25 上传
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 (30.13 KB, 下载次数: 0)下载附件2017-7-25 16:25 上传
4.本地启动项目,postman调用哪个接口测试:
相关文章推荐
- Spring AOP在函数接口调用性能分析及其日志处理方面的应用
- 自己利用接口创建监听器并调用
- 通过日志定位分析接口调用缓慢的原因
- JAVA利用HttpClient进行HTTPS接口调用
- 利用nginx+lua实现通用的请求输入输出日志打印
- 利用backtrace函数打印函数调用栈
- 使用 Nlog 将日志打印到 Logstash 的监控接口
- C#利用接口实现窗体间函数调用
- JAVA利用HttpClient进行HTTPS接口调用
- SpringBoot中使用AOP打印接口日志的方法
- nginx 接口单独划分日志
- 利用WebService调用天气接口
- 利用生产者消费者模式实现HTTP接口的异步调用
- 微信公众账号利用post方法调用接口实现方法
- LR做接口压力测试时,后台打印日志的异常信息
- C# 利用xmlhttp根据网址调用接口获取数据
- 日志 - 打印函数的调用过程
- js调用打印接口打印web页面之——使用lodop组件打印jsp web页面
- Java调用TSC条码打印机接口打印条码和二维码
- JAVA 学习日志 利用循环打印简单的菱形程序