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. 请实现字符串左旋转的函数. * ...
随机推荐
- python的编解码问题
http://blog.chinaunix.net/uid-27838438-id-4227131.html
- 微信小程序 request域名配置好之后,还是提示报错配置的域名不在request合法域名中
自己尝试着用nodejs搭个后台服务的时候,用了端口号,然后在小程序中使用的时候,报错说配置的域名不在request合法域名中 明明已经配置好了的啊,看着报错信息.仔细对比了一下两个url请求地址,发 ...
- Genymotion的使用 -- A Faster Android Emulator
Genymotion 安装与配置 1,Genymotion 模拟器 EditText获取焦点时不自动弹出软件盘 选择该模拟器的设置--> 选中Use Virtual keyboard for t ...
- [转]理解$watch ,$apply 和 $digest --- 理解数据绑定过程
原文地址:http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ 注 这篇博文主要是写给新手的,是给那些刚刚开始 ...
- Python 列表的切片和连接
一.定义一个list >>> a = [1, 3, 4, 5, 'a', 's'] >>> a [1, 3, 4, 5, 'a', 's'] 二.获取列表中前3个元 ...
- [转]java 中的序列化是什么意思?有什么好处?
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...
- 蓝桥杯 算法训练 ALGO-141 P1102
算法训练 P1102 时间限制:1.0s 内存限制:256.0MB 定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过10 ...
- AngularJS:参考手册
ylbtech-AngularJS:参考手册 1.返回顶部 1. AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用 ...
- java restful response 万能类
import java.util.HashMap; import java.util.Map; public class ResponseData { private final String mes ...
- rails 自定义校验及validates_each多校验
一.自定义校验 使用 validate 方法传入一个同名方法的 Symbol 即可. validate :my_validation private def my_validation if name ...