【HAVENT原创】使用 Spring Boot 的 AOP 全局记录执行时间日志
2018-08-13 11:15
956 查看
基本配置使用:
1. 在 pom.xml 中增加基础类库引用
2. 配置文件 application.yml 中增加参数配置
3. 新增 KafkaLogAspect.java 拦截器类
注意代码中 execution(* com.havent.demo..*(..)) 表示监控范围为 com.havent.demo 下面的所有方法
调用 com.havent.demo 下面的方法,捕获日志如下:
进阶操作,监控 controller 操作,获取 web 请求信息:
执行结果如下:
1. 在 pom.xml 中增加基础类库引用
<!-- HH: 引入 spring-boot-aop 模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2. 配置文件 application.yml 中增加参数配置
spring: application: name: HAVENT-SPRING-BOOT-DEMO aop: auto: true #proxy-target-class: true
3. 新增 KafkaLogAspect.java 拦截器类
package com.havent.demo.aop.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; @Aspect @Component public class KafkaLogAspect { /** * 环绕通知:目标方法执行前后分别执行一些代码,发生异常的时候执行另外一些代码 * @return */ @Around(value="execution(* com.havent.demo..*(..))") public Object aroundMethod(ProceedingJoinPoint joinPoint){ long beginTime = System.currentTimeMillis(); //请求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); String loggerType = className + "." + methodName; Object result = null; try { System.out.println("【前置通知】:the method 【" + loggerType + "】 begins with " + Arrays.asList(joinPoint.getArgs())); //执行目标方法 result = joinPoint.proceed(); System.out.println("【返回通知】:the method 【" + loggerType + "】 ends with " + result); } catch (Throwable e) { System.out.println("【异常通知】:the method 【" + loggerType + "】 occurs exception " + e); } // 执行时长(毫秒) long time = System.currentTimeMillis() - beginTime; System.out.println("【后置通知】:-----------------end.---------------------- time:" + time); return result; } }
注意代码中 execution(* com.havent.demo..*(..)) 表示监控范围为 com.havent.demo 下面的所有方法
调用 com.havent.demo 下面的方法,捕获日志如下:
进阶操作,监控 controller 操作,获取 web 请求信息:
package com.havent.demo.aop.aspect; import com.havent.demo.logger.service.KafkaService; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @Aspect @Component public class KafkaLogAspect { @Autowired private KafkaService logger; @Pointcut("execution(public * com.havent.demo.controller.*.*(..))") public void webLog(){} @Before("webLog()") public void deBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 System.out.println("URL : " + request.getRequestURL().toString()); System.out.println("HTTP_METHOD : " + request.getMethod()); System.out.println("IP : " + request.getRemoteAddr()); System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs())); //logger.trace(""); } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 System.out.println("方法的返回值 : " + ret); //logger.trace(""); } //后置异常通知 @AfterThrowing("webLog()") public void throwss(JoinPoint jp){ System.out.println("方法异常时执行....."); //logger.trace(""); } //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行 @After("webLog()") public void after(JoinPoint jp){ System.out.println("方法最后执行....."); } //环绕通知,环绕增强,相当于MethodInterceptor @Around("webLog()") public Object arround(ProceedingJoinPoint pjp) { System.out.println("方法环绕start....."); try { Object o = pjp.proceed(); System.out.println("方法环绕proceed,结果是 :" + o); return o; } catch (Throwable e) { e.printStackTrace(); return null; } } }
执行结果如下:
相关文章推荐
- 【HAVENT原创】使用 Spring Boot 的 AOP 拦截器终止方法执行
- spring boot aop 记录方法执行时间代码示例
- 使用Spring3.0的AOP结合log4j实现接口方法执行时间记录
- 使用Spring的AOP实现接口方法执行时间记录
- spring boot aop 记录方法执行时间
- 【HAVENT原创】使用 Spring Boot 的 AOP 自定义注解
- AspectJ spring aop 记录某些类中方法执行时间实例
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况)
- Spring boot中使用log4j记录日志
- 一个用Spring AOP实现异常处理和记录程序执行时间的实例(二)
- SpringBoot+Maven项目实战(6):整合Log4j和Aop,实现简单的日志记录
- Spring Boot(十一)使用AOP,@Aspect统一处理Web请求日志
- Spring Boot实战之配置使用Logback进行日志记录
- 使用spring aop + 注解完成对业务操作的日志记录
- 利用Spring AOP记录方法的执行时间
- 使用Spring AOP 的@AspectJ记录日志
- AspectJ spring aop 记录某些类中方法执行时间实例
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前
- 一个用Spring AOP实现异常处理和记录程序执行时间的实例(一)
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)