AOP创建日志(注解型)

此方法为AOP注解型打印日志,至于日志的插入本文不作介绍。

具体说明如下

使用Gradle 导包

compile 'org.springframework.boot:spring-boot-starter-aop

自定义一个注解类,代码如下

package cn.cityworks.domain;
import java.lang.annotation.*;
/**
 * @author: zsx
 * @date: 2019/4/17 0017
 * 这是一个自定义的注解类。用于指定XX访问可以被记录日志
 */
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface MyLog {
    String value() default "";
}

增加切面方法类。代码如下:

package cn.cityworks.utils;


import javax.servlet.http.HttpServletRequest;
import cn.cityworks.domain.MyLog;
import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import java.lang.reflect.Method;

@Aspect
@Component
public class AspectLog {
    //定义切点 @Pointcut
    //在注解的位置切入代码
    @Pointcut("@annotation( cn.cityworks.domain.MyLog)")
    public void logPoinCut() {
    }
    @AfterReturning("logPoinCut()")
    public void saveSysLog(JoinPoint join) {
        //可以打印在控制台上
        Logger log = LoggerFactory.getLogger(AspectLog.class);

        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) join.getSignature();
        //获取切入点所在的方法
        Method method = signature.getMethod();
        //获取操作
        MyLog myLog = method.getAnnotation(MyLog.class);
        if (myLog != null) {
            String value = myLog.value();
            log.info("操作:"+value);//保存获取的操作
        }

        //获取请求的类名
        String className = join.getTarget().getClass().getName();
        //获取请求的方法名
        String methodName = method.getName();
        log.info("方法名"+className + "." + methodName);

        //请求的参数
        Object[] args = join.getArgs();
        //将参数所在的数组转换成json
        String params = JSON.toJSONString(args);
        log.info("params:{}"+params);

        ServletRequestAttributes attriButes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
           HttpServletRequest request = attriButes.getRequest();

        //打印url
        log.info("url:{}", request.getRequestURL());

        //打印请求方式
        log.info("requet_method:{}", request.getMethod());

        //打印类方法
        log.info("class_method:{}", join.getStaticPart().getSignature().getDeclaringTypeName()
                + "."
                + join.getSignature().getName());
        //打印参数
        log.info("parameter:{}", join.getArgs());

        //打印Ip
        log.info("ip:{}", request.getLocalAddr());
    }

}


准备工作已经完成。接下来对应的Controller层增加注解(未增加注解的方法不会被打印)。
以登录为例,加上注解 @MyLog(value = “登录”)即可:

在这里插入图片描述
结果展示:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IT_Java_Roy/article/details/89358163
今日推荐