SpringBoot之日志AOP

SpringBoot有自己的日志框架,比如 SLF4J和logback,今天不使用他们两个。今天就结合Spring框架学习的AOP搞一个自定义日志记录。
首先加入AOP依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

定义一个注解@:

import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
    /** 要执行的操作类型比如:add操作 **/
    String value() default "";
}

编写一个Aspect类,使用@sysLog在Controller层的每一个方法前注入,然后根据我们的日志需求编写相应的代码,并可以通过Service把日志保存在数据库中:

@Aspect
@Component
public class SysLogAspect {

    private  static  final Logger logger = LoggerFactory.getLogger(SysLogAspect.class);

    @Autowired
    private LogService logService;

    //Controller层切点
    @Pointcut("execution (* com.***.***.controller..*.*(..))")
    public  void controllerAspect() {}

    @After("@annotation(sysLog)") 
    public void doBefore(JoinPoint joinPoint,SysLog sysLog) {
        String id = StringUtils.getUUID();
        //获取注解里的值
        String operation =  sysLog.value();

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        String loginName = (String) session.getAttribute("loginName");

        String ip = request.getRemoteHost();
        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        String date = DateUtils.getYearDate();

        Log log = new Log();

        log.setId(id);
        log.setLoginname(loginName);//用户名
        log.setIp(ip);//请求ip
        log.setUrl(url);//请求url
        log.setMethod(method);//请求方式
        log.setOperation(operation);//执行的操作
        log.setTargetName(targetName);//请求的Controller
        log.setMethodName(methodName);//请求的方法
        log.setDate(date);//请求时间

        int result =  logService.insert(log);
        if(result == 1 ){
            logger.info("新增一条日志记录:"+log.toString());
        }else{
            logger.error("新增日志记录失败!!!");
        }

    }
}

@SysLog注解方法:
这里写图片描述

效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26641781/article/details/80492563