springcloud 定义切面实现对请求操作记录日志,方便后面分析接口详情
package com.idoipo.infras.gateway.open.config; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.idoipo.infras.gateway.open.model.InvokeLogModel;
import com.idoipo.infras.gateway.open.service.IInvokeLogService;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* Create by liping on 2018/8/20
*/
@Aspect
@Configuration//定义一个切面
public class LogRecodeAspect { private static final Logger logger = LoggerFactory.getLogger(LogRecodeAspect.class); @Autowired
IInvokeLogService invokeLogService; // 定义切点Pointcut
@Pointcut("execution(public * com.idoipo.infras.gateway.open.controller..*.*(..))")
public void excudeService() {
} @Around("excudeService()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String url = request.getRequestURI();
String method = request.getMethod();
String queryString = request.getQueryString();
Object[] args = pjp.getArgs();
String params = "";
String invokeUser = "";
int userFlag = 1;
//获取请求参数集合并进行遍历拼接
if(args.length>0){
if("POST".equals(method)){
Object object = args[0];
Map map = getKeyAndValue(object); params = JSON.toJSONString(map);
}else if("GET".equals(method)){
if(null!=queryString&&""!=queryString){
String[] paramArray = queryString.split("&");
for(String param : paramArray){
String[] keyValue = param.split("=");
String key = keyValue[0];
if(keyValue[0].equals("user")){
invokeUser = keyValue[1];
}else if(keyValue[0].equals("userFlag"))
userFlag = Integer.parseInt(keyValue[1]);
}
params = queryString;
} }
}
logger.info("请求开始地址={},类型={},参数={}:",url,method,params);
Date startTime = new Date();
// result的值就是被拦截方法的返回值
Object result = pjp.proceed();
boolean responseResult = false;
String response = JSONObject.toJSONString(result);
logger.info("请求结束===返回值={}:" + response);
Date endTime = new Date();
InvokeLogModel invokeLogModel = new InvokeLogModel();
invokeLogModel.setInterfaceName(url);
invokeLogModel.setInterfaceMethod(method); invokeLogModel.setInvokeStartTime(startTime);
invokeLogModel.setRequestParam(params); invokeLogModel.setResponseResult(responseResult);
invokeLogModel.setInvokeEndTime(endTime); invokeLogService.insertInvokerLog(invokeLogModel);
return result;
} public static Map<String, Object> getKeyAndValue(Object obj) {
Map<String, Object> map = new HashMap<>();
// 得到类对象
Class userCla = obj.getClass();
/* 得到类中的所有属性集合 */
Field[] fs = userCla.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
Object val ;
try {
val = f.get(obj);
// 得到此属性的值
map.put(f.getName(), val);// 设置键值
} catch (IllegalArgumentException e) {
logger.error("解析参数异常",e);
} catch (IllegalAccessException e) {
logger.error("解析参数异常",e);
} }
return map;
}
}
package com.idoipo.infras.gateway.open.model;
import java.util.Date;
public class InvokeLogModel {
//自增id
private int id;
//接口名
private String interfaceName;
//接口方法类型 GET or POST之类的
private String interfaceMethod;
//调用接口开始的时间
private Date invokeStartTime;
//调用接口结束的时间
private Date invokeEndTime;
//接口请求参数
private String requestParam;
//是否有响应值
private Boolean responseResult;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getInterfaceName() {
return interfaceName;
}
public void setInterfaceName(String interfaceName) {
this.interfaceName = interfaceName;
}
public String getInterfaceMethod() {
return interfaceMethod;
}
public void setInterfaceMethod(String interfaceMethod) {
this.interfaceMethod = interfaceMethod;
}
public Date getInvokeStartTime() {
return invokeStartTime;
}
public void setInvokeStartTime(Date invokeStartTime) {
this.invokeStartTime = invokeStartTime;
}
public Date getInvokeEndTime() {
return invokeEndTime;
}
public void setInvokeEndTime(Date invokeEndTime) {
this.invokeEndTime = invokeEndTime;
}
public String getRequestParam() {
return requestParam;
}
public void setRequestParam(String requestParam) {
this.requestParam = requestParam;
}
public Boolean getResponseResult() {
return responseResult;
}
public void setResponseResult(Boolean responseResult) {
this.responseResult = responseResult;
}
@Override
public String toString() {
return "InvokeLogModel{" +
"id=" + id +
", interfaceName='" + interfaceName + '\'' +
", interfaceMethod='" + interfaceMethod + '\'' +
", invokeStartTime=" + invokeStartTime +
", invokeEndTiem=" + invokeEndTime +
", requestParam='" + requestParam + '\'' +
", responseResult=" + responseResult +
'}';
}
}
springcloud 定义切面实现对请求操作记录日志,方便后面分析接口详情的更多相关文章
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- 【原创-算法-实现】异步HTTP请求操作
一.说明 1) 这个类 是我 在真实项目中,优化解决真实问题 时,不参考第三方代码,完全由自己查阅MSDN官方文档 , 完成的一个真实生产环境中使用的功能类 2) 读者在使用此类时,请尊重原创,在代码 ...
- Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“
第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ...
- 【转】python3 urllib.request 网络请求操作
python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...
- 假定某系统提供硬件的访管指令(例如形式:“svc n”),为了实现系统调用,系统设计者应做哪些工作?用户又如如何请求操作系统服务?
工作: 1. 编写并调试好能实现各种功能的例行子程序. 2. 编写并调试好访管中断处理程序. 3. 构造例行子程序入口地址表. 在用户程序中,需要请求操作系统服务的地方安排一条系统调用.这样,当 ...
- 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法
类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{ public $name;//成员变量 //成员属性(存在于强类型语言中) prot ...
- Error: 实例 "ddd" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: Exceeded maximum number of retries. Exhausted all hosts available for retrying build failures for instance 6f60bc06-fcb6-4758-a46f-22120ca35a71.].
Error: 实例 "ddd" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Exceeded maximum number of retries. Exhaus ...
- python3 urllib.request 网络请求操作
python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...
- 【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * ...
随机推荐
- unity shader 内置变量
官网Manual:http://docs.unity3d.com/Manual/SL-UnityShaderVariables.html unity提供大量的内置变量,来供我们使用,主要包括一些 :矩 ...
- 【HTML5】Canvas绘制基础
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- oracle如何insert into 多个values
稍微熟悉Oracle的都知道,如果我们想一条SQL语句向表中插入多个值的话,如果如下语句 INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....; 这样会报错的,因为 ...
- QtCreator开启-O编译优化的方式
首先,编译优化必须是在Release模式下进行,保证程序没有任何bug的条件下进行执行.编译优化能极大提升程序的运行效率,级别越高速度越快,但是对代码健壮性要求也越高! 选择编译release模式,在 ...
- Java中throw和throws的区别【转】
系统自动抛出的异常所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 用 ...
- mysql函数之三:find_in_set() 函数 返回str在字符串集strlist中的序号
如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N. FIND_IN_SET(str,strlist) 如果字符串str是在的strlist组成的N子串的字符串列表,返 ...
- Java-API-POI-Excel:SXSSFWorkbook Documentation
ylbtech-Java-API-POI-Excel:SXSSFWorkbook Documentation 1.返回顶部 1. org.apache.poi.xssf.streaming Class ...
- 侯捷STL学习(二)--序列容器测试
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
- 在云服务器上体验Docker
1. 添加Docker repository key sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -" 2. ...
- CUDA编程接口:异步并发执行的概念和API
1.主机和设备间异步执行 为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了.它们是: 内核发射; 设备间数据拷贝函数; 主机和设备内拷贝小于64KB ...