平常开发的话难免会出问题,这个时候日志就是很重要的了,现在就需要用到切面来记录方法入参出参了。
1.环境搭建
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
web,日志,切面所需的组件
方法:使用切面
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Aspect
@Configuration
@Slf4j
public class LogAop {
@Pointcut("execution(* com.yl.store.controller..*.*(..))")
public void monitor(){}
@Around("monitor()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object[] args = proceedingJoinPoint.getArgs();
Object proceed = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
log.debug("Entering Info"+ Arrays.toString(args));
log.debug("Leaving Info "+proceed);
return proceed;
}
@Bean
public Advisor traceAdvisor(){
CustomizableTraceInterceptor customizableTraceInterceptor=new CustomizableTraceInterceptor();
customizableTraceInterceptor.setEnterMessage("Entering ClassName=$[targetClassShortName]:$[methodName]($[arguments])");
customizableTraceInterceptor.setExitMessage("Leaving $[methodName](): $[returnValue]");
customizableTraceInterceptor.setUseDynamicLogger(true);
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("com.yl.store.aop.LogAop.monitor()");
return new DefaultPointcutAdvisor(pointcut,customizableTraceInterceptor);
}
}
这里使用了两个不同的方式around方法直接使用了切面获取参数并打印,traceAdvisor这个方法返回了一个工具更简单的实现了方法参数记录
测试control
package com.yl.store.controller;
import com.yl.store.controller.dto.UserInfo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @author yl
* @create 2023-02-24 16:15
**/
@RestController
public class TestControl {
@PostMapping("/test001")
public UserInfo getInfo(@RequestBody UserInfo userInfo){
userInfo.setUserage(50);
return userInfo;
}
}
使用postman进行测试
控制台信息
大概就是这样咯