背景介绍
- 可以通过日志级别来打印控制器的请求参数和返回数据
- 可以通过注解实现指定日志功能(例如URL请求频率)
设计思路
通过Spring AOP来实现日志,控制器的日志打印在框架中默认实现,同时再增加@Log注解,具体类或者方法的日志实现,可以自己实现。
代码
控制器的日志切面
直接使用@Around注解,因为控制器已经加了异常处理,所以忽略 @AfterReturning 和 @AfterThrowing
package com.xmasq.core.log;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.CodeSignature;
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 javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* 基础日志(控制层)
*
* @author guoyu.huang
* @version 1.0.0
*/
@Aspect
@Component
@Slf4j
public class BaseLogAspect {
@Pointcut("@within(org.springframework.stereotype.Controller) || @within(org.springframework.web.bind.annotation.RestController)")
public void pointcut() {
// NOTHING
}
@Around("pointcut()")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String url = request.getRequestURL().toString();
String reqParam = getRequestParam(joinPoint);
String