springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息;这里主要讲解两种切入点方式,一种方法切入,一种注解切入;首先创建个springboot测试工程并通过maven添加如下依赖:

复制代码

org.springframework.boot
spring-boot-starter-aop

com.alibaba
fastjson
1.2.44

复制代码
  先来说方法的切点方式,需要创建个名为LogAspect的组件类,然后用@Aspect注解修饰组件类,再通过设置方法切入点方式做公共日志记录,如下创建切入点:
复制代码
//切点入口 Controller包下面所有类的所有方法
private final String pointcut = "execution(* com.platform.Controller..*(..))";
//切点
@Pointcut(value = pointcut)
public void log() {
}
复制代码
  这里的execution( com.platform.Controller..(..))主要的意思是:切入点入口是Controller包下面所有类的所有方法;再来通过@Around环绕注解方法里面做请求参数和响应信息的记录,如下代码:
复制代码
@Around(value = "log()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = null;
StringBuilder sbLog = new StringBuilder("\n");
try {
sbLog.append(String.format("类名:%s\r\n", proceedingJoinPoint.getTarget().getClass().getName()));
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
sbLog.append(String.format("方法:%s\r\n", methodSignature.getMethod().getName()));
Object[] args = proceedingJoinPoint.getArgs();
for (Object o : args) {
sbLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));
}
long startTime = System.currentTimeMillis();
result = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();
sbLog.append(String.format("返回:%s\r\n", JSON.toJSON(result)));
sbLog.append(String.format("耗时:%ss", endTime - startTime));
} catch (Exception ex) {
sbLog.append(String.format("异常:%s", ex.getMessage()));
} finally {
logger.info(sbLog.toString());
}
return result;
}
复制代码
  此刻主要代码就完成了,再来我们配置下日志的记录方式;首先在 resources目录增加名为logback-spring.xml的文件,其配置信息如:
复制代码
1
2
6
7
8
9
10
11
12
13
14
15 logback
16
17
18
19 WARN
20 -->
21
22 %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
23
24
25
26
27 ${logPathAll}
28
29 ${logPathAll}.%d{yyyy-MM-dd}.zip
30
31
32 %date %level [%thread] %logger{36} [%file : %line] %msg%n
33
34
35
36
37
38
39
40
41
42
复制代码
  然后application.yml的配置信息如:
复制代码
1 logging:
2 config: classpath:logback-spring.xml
3 logback:
4 level: info #info ,debug
5 path: /home/app/data/applogs/weblog
6 appname: web
复制代码
  此刻日志和公共的aop记录类都完成了,我们需要创建个测试用例,其代码如:
复制代码
1 @PostMapping("/addUser")
2 public ResponseEntity addUser(@RequestBody MoStudent moStudent) throws Exception {
3 moStudent.setNumber(UUID.randomUUID().toString());
4 // throw new Exception("错误了");
5 return new ResponseEntity(moStudent, HttpStatus.OK);
6 }
复制代码
  最后,通过postman模拟post请求,能够得到如下的日志结果:
  
  上面的方式切入点是所有方法,所有方法都记录日志可能有是不是需求想要的,此时可以通过注解的方式来标记想记录日志的方法;先来创建个日志注解:
复制代码
1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 public @interface LogAnnotation {
5 /**
6 * 描述
7 *
8 * @return
9 */
10 String des() default "";
11 }
复制代码
  同样再来创建注解的切入点:
复制代码
1 //匹配方法上包含此注解的方法
2 private final String annotationPointCut = "@annotation(com.platform.Aop.LogAnnotation)";
3
4 //注解切点
5 @Pointcut(value = annotationPointCut)
6 public void logAnnotation() {
7 }
复制代码
  再通过@Around注解绑定具体的操作方法:
复制代码
1 @Around(value = "logAnnotation()")
2 public Object aroundAnnotation(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
3 Object result = null;
4 StringBuilder sbLog = new StringBuilder("\n");
5 try {
6 sbLog.append(String.format("类名:%s\r\n", proceedingJoinPoint.getTarget().getClass().getName()));
7
8 MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
9 Method method = methodSignature.getMethod();
10 LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
11 if (logAnnotation != null && !logAnnotation.des().isEmpty()) {
12 sbLog.append(String.format("说明:%s\r\n", logAnnotation.des()));
13 }
14 sbLog.append(String.format("方法:%s\r\n", method.getName()));
15
16 Object[] args = proceedingJoinPoint.getArgs();
17 for (Object o : args) {
18 sbLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));
19 }
20
21 long startTime = System.currentTimeMillis();
22 result = proceedingJoinPoint.proceed();
23 long endTime = System.currentTimeMillis();
24 sbLog.append(String.format("返回:%s\r\n", JSON.toJSON(result)));
25 sbLog.append(String.format("耗时:%ss", endTime - startTime));
26 } catch (Exception ex) {
27 sbLog.append(String.format("异常:%s", ex.getMessage()));
28 } finally {
29 logger.info(sbLog.toString());
30 }
31 return result;
32 }
复制代码
  这个方法里需要注意的是注解方式相比第一种其实就多了如下几行代码:
1 Method method = methodSignature.getMethod();
2 LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
3 if (logAnnotation != null && !logAnnotation.des().isEmpty()) {
4 sbLog.append(String.format("说明:%s\r\n", logAnnotation.des()));
5 }
  下面是注解测试用例:
复制代码
1 @LogAnnotation(des = "注解记录日志")
2 @PostMapping("/addUser01")
3 public ResponseEntity addUser01(@RequestBody MoStudent moStudent) throws Exception {
4 moStudent.setNumber(UUID.randomUUID().toString());
5 return new ResponseEntity(moStudent, HttpStatus.OK); 欢迎工作一到五年的Java工程师朋友们加入Java群: 891219277
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
6 }
复制代码

原文地址:http://blog.51cto.com/14084556/2335046

时间: 2024-08-26 02:34:51

springboot+aop切点记录请求和响应信息的相关文章

Spring Boot使用AOP在控制台打印请求、响应信息

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果.其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足. 通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将

nginx log记录请求的头信息

记录访问的log,为了在出现特殊情况时,方便检查出现问题的地方.log_format accesslog ‘$remote_addr – $remote_user [$time_local] “$request” ‘‘$status $body_bytes_sent “$http_referer” ‘‘”$http_user_agent” $http_x_forwarded_for';access_log /var/log/nginx/access.log accesslog;记录下,用户ip,

Fiddler如何自动修改请求和响应包

Charles的Map功能可以将某个请求进行重定向,用重定向的内容响应请求的内容.这个功能非常方便.在抓包过程当中,有时候为了调试方便,需要将线上的服务定位到内网.比如我们线上的服务器域名为 api.example.com,而内网的用于调试的服务器域名为 test.neiwang.com,那么就需要将所有域名 api.example.com替换为 test.neiwang.com,就可以使用charles的这个功能,但是charles是收费软件,使用破解版又可能不安全,所以我们需要用一款免费抓包

SpringBoot使用AOP记录请求日志和异常日志

本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar: 起步依赖 web及aop依赖 jpa依赖 mysql驱动 本文着重AOP的使用,你也可以使用自己构建的环境 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类 保存日志的实体类: 日志实体 保存异常的实体类: 异常实体 接下来我们定义一个Operation注

ASP.NET Web API 记录请求响应数据到日志的一个方法

原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个方法 REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉.后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看. 今天这篇文章是使用ASP.NET W

nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来找出站点中处理时间较长的请求, 这些请求是造成服务器高负载的很大根源. 日志记录之后,在使用perl脚本分析日志,即可知道哪些请求需要修正. 1. 模块安装 nginx第三方模块安装方法,我们ttlsa.com已经说过很多次了,我这边不在重复了.配置参数 1 2 ./configure --pref

springboot Aop 统一处理Web请求日志

1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.编写切面类 @Aspect @Component public class WebLogAspect {} 注解 @Aspect 表明这是个切面类 3.定义切点 @Pointcut

LoadRunner 获取接口请求响应信息

Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_param_len("262144"); //自定义截取字符串,根据左右字符串获取数据,设置查找范围为消息体.左右查找边界为空则可以获取整个响应体的内容 web_reg_save_param("ResponseBody", "LB=", "RB=&

【转帖】客户端通过 HTTP 请求和响应 的 Header 信息总结

请求Header原帖地址:http://technique-digest.iteye.com/blog/1174581 响应Header原帖地址:http://blog.pfan.cn/hurongliang/24720.html 客户端HTTP请求的Header信息 1.HTTP请求方式 如下表: 方 法 描 述 GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEAD 检查一个对象是否存在 D