Aop 日志切面,打印日志
2021/12/10 23:24:49
本文主要是介绍Aop 日志切面,打印日志,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 日志打印用来监控程序的执行很重要
手动在Controller 里面打印日志很繁琐。
package com.mangoubiubiu.controller; import com.alibaba.fastjson.JSONObject; import com.mangoubiubiu.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @RestController @Slf4j public class LoginController { @PostMapping("login") public R login(@RequestBody JSONObject jsonObject, HttpServletRequest request){ log.info("Thread name is {} Invoke api url is {} in params is {}",Thread.currentThread().getName(),request.getRequestURL(),jsonObject.toJSONString()); //----业务代码 调用service log.info("Thread name is {} Invoke api url is {} out params is {}",Thread.currentThread().getName(),request.getRequestURL(),R.ok().data(jsonObject)); return R.ok().data(jsonObject); } }
虽然也能打印到,但是有一万个 方法 就复制黏贴二万条 那多多少少有点拉胯,而且不易维护。
二 进阶,利用Aop进行切面,进行日志打印
package com.mangoubiubiu.aspect; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; 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 @Slf4j public class LogAspect { /** * 切入点 */ @Pointcut("execution(public * com.mangoubiubiu.controller.*.*(..))") public void pointCut(){} /** * 前置通知 在目标方法 运行前执行 * @param joinpoint */ @Before("pointCut()") public void logStart(JoinPoint joinpoint){ HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String requestURL = request.getRequestURL().toString(); //获取入参信息 Object[] args= joinpoint.getArgs(); log.info("Thread name is {} Invoke api url is {} in params is {}",Thread.currentThread().getName(),requestURL,Arrays.asList(args)); } /** * 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后执行 * @param joinpoint * @param result */ //JoinPoint 一定要出现在参数表的第一位 @AfterReturning(value="pointCut()",returning="result") public void logreturn(JoinPoint joinpoint,Object result){ HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String requestURL = request.getRequestURL().toString(); log.info("Thread name is {} Invoke api url is {} out params is {}",Thread.currentThread().getName(),requestURL,result); } }
测试
2021-12-10 22:04:38.530 INFO 9816 --- [io-10090-exec-1] com.mangoubiubiu.aspect.LogAspect : Thread name is http-nio-10090-exec-1 Invoke api url is http://127.0.0.1:10090/login_by_session/login in params is [{"mayr":"你看后"}, org.apache.catalina.connector.RequestFacade@6eaba842] 2021-12-10 22:04:38.594 INFO 9816 --- [io-10090-exec-1] com.mangoubiubiu.aspect.LogAspect : Thread name is http-nio-10090-exec-1 Invoke api url is http://127.0.0.1:10090/login_by_session/login out params is R(success=true, code=20000, message=成功, data={"mayr":"你看后"})
非常nice
二 再次进阶,如果我想计算接口调用耗时 怎么做---利用环绕通知(永远滴神)
package com.mangoubiubiu.aspect; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import sun.rmi.transport.ObjectTable; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; /** * 日志切面类 */ @Aspect @Component @Slf4j public class LogAspect { /** * 切入点 */ @Pointcut("execution(public * com.mangoubiubiu.controller.*.*(..))") public void pointCut(){} /** * 前置通知 在目标方法 运行前执行 * @param joinpoint */ //@Before("pointCut()") public void logStart(JoinPoint joinpoint){ HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String requestURL = request.getRequestURL().toString(); //获取入参信息 Object[] args= joinpoint.getArgs(); log.info("Thread name is {} Invoke api url is {} in params is {}",Thread.currentThread().getName(),requestURL,Arrays.asList(args)); } /** * 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后执行 * @param joinpoint * @param result */ //JoinPoint 一定要出现在参数表的第一位 //@AfterReturning(value="pointCut()",returning="result") public void logreturn(JoinPoint joinpoint,Object result){ HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String requestURL = request.getRequestURL().toString(); log.info("Thread name is {} Invoke api url is {} out params is {}",Thread.currentThread().getName(),requestURL,result); } /** * 环绕通知 * @param joinPoint * @return */ @Around("pointCut()") public Object around(ProceedingJoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String requestURL = request.getRequestURL().toString(); Object[] args= joinPoint.getArgs(); try { Long startTime=System.currentTimeMillis(); log.info("Thread name is {} Invoke api url is {} in params is {}",Thread.currentThread().getName(),requestURL,Arrays.asList(args)); //执行目标方法 Object result = joinPoint.proceed(); log.info("Thread name is {} Invoke api url is {} out params is {} Time-consuming {}ms",Thread.currentThread().getName(),requestURL,result,System.currentTimeMillis()-startTime); return result; }catch (Throwable e){ } return null; } }
注掉了哈
测试
非常强大
三 再次进阶,环绕通知 篡改返回参数
测试
非常强大 , 环绕通知的返回参数,就是方法的返回参数,并且能修改方法的返回参数,在实际应用场景中可以塞值,非常好用。
这篇关于Aop 日志切面,打印日志的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南