自定义Log 注解
/**
* <简述>自定义日志注解
* <详细描述>
* @author syf
* @date 2023/7/5 10:22
* @return null
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value();
}
编写注解的切面类
/**
* <简述>
* <详细描述>
*
* @author syf
* @date 2023年07月05日 10:24
*/
@Slf4j
@Component //放入容器中
@Aspect //切面类直接
public class LogAspect {
//切点:切自己定义的Log的注解
@Pointcut("@annotation(com.ratelimiter.demo.annotation.Log)")
public void pointCut(){}
/**
* <简述>在方法之前执行
* <详细描述>可以获取一些请求的入参,以及请求 地址信息等
* @author syf
* @date 2023/7/19 15:23
* @param joinPoint
*/
@Before("pointCut()")
public void before(JoinPoint joinPoint){
HttpServletRequest request = RequestHolder.getRequest();
//请求方法
String method = request.getMethod();
//请求路径
String requestURI = request.getRequestURL().toString();
//请求参数
Object[] args = joinPoint.getArgs();
String s = Arrays.toString(args);
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
//获取注解入参
Log annotation = signature.getMethod().getAnnotation(Log.class);
String value = annotation.value();
log.info("请求方法: {}", method);
log.info("请求路径: {}", requestURI);
log.info("请求参数: {}", s);
log.info("注解入参: {}", value);
}
/**
* <简述>记录方法 返回
* <详细描述>
* @author syf
* @date 2023/7/19 15:26
* @param o
*/
@AfterReturning(returning = "o", pointcut = "pointCut()")
public void afterReturning(Object o){
log.info("restult---->", o);
}
}
测试:编写请求并且在切面类上标注
@RestController
public class TestController {
@GetMapping("/test")
/**
* 限流,10 秒之内,这个接口可以访问 3 次
*/
@Log("6666")
@RateLimiter(time = 10, count = 3,limitType = LimitType.IP)
public String test(@RequestParam("name") String name) {
return "ok" ;
}
}
结果展示:
2023-07-05 10:58:51.080 INFO 5044 --- [nio-8080-exec-1] com.ratelimiter.demo.RateLimiterAspect : 一个时间窗内请求次数:3,当前请求次数:1,缓存的 key 为 rate_limit:127.0.0.1-com.ratelimiter.demo.TestController-test
2023-07-05 10:58:51.081 INFO 5044 --- [nio-8080-exec-1] com.ratelimiter.demo.aspect.LogAspect : 请求方法: GET
2023-07-05 10:58:51.081 INFO 5044 --- [nio-8080-exec-1] com.ratelimiter.demo.aspect.LogAspect : 请求路径: http://localhost:8080/test
2023-07-05 10:58:51.081 INFO 5044 --- [nio-8080-exec-1] com.ratelimiter.demo.aspect.LogAspect : 请求参数: [syf]
2023-07-05 10:58:51.081 INFO 5044 --- [nio-8080-exec-1] com.ratelimiter.demo.aspect.LogAspect : 注解入参: 6666