springboot 使用aop 監控接口請求信息


maven依賴

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

創建注解類

package com.avivacofco.epidemic.aop;

import java.lang.annotation.*;

/**
 * @author :jerry_wei
 * @date :Created in 2020/5/25 17:41
 * @description:請求日志
 * @modified By:
 * @version:
 */
//注解聲明周期
@Retention(RetentionPolicy.RUNTIME)
//注解 修飾方法
@Target(ElementType.METHOD)
@Documented
public @interface ResLog {

    //接口描述
    String desc() default  "";

}

  

配置內容

package com.avivacofco.epidemic.aop;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
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 javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * @author :jerry_wei
 * @date :Created in 2020/5/25 17:44
 * @description:
 * @modified By:
 * @version:
 */
@Aspect
@Component
public class AopConfig {

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

    @Pointcut("@annotation(com.avivacofco.epidemic.aop.ResLog)")
    public void resLog(){

    }


    @Around("resLog()")
    public Object around(ProceedingJoinPoint pjp){
        long begin = System.currentTimeMillis();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        Signature signature = pjp.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        ResLog resLog = method.getAnnotation(ResLog.class);

        String desc = resLog.desc();

        //可以添加日志表
        //記錄用戶 軌跡
        // 先進 filter 在進 interceptor 最后進 aop
        // 可以通過 token 攔截,然后 通過token 獲取用戶數據 在aop 中 獲取 user 數據


        logger.info("請求開始");
        logger.info("請求連接 {}",request.getRequestURL().toString());
        logger.info("接口描述 {}",desc);
        logger.info("請求類型 {}",request.getMethod());
        logger.info("請求方法 {}.{}",signature.getDeclaringTypeName(),signature.getName());
        logger.info("請求ip {}",request.getRemoteAddr());
        logger.info("請求入參 {}", JSON.toJSONString(pjp.getArgs()));
        logger.info("請求token {}",request.getHeader("sso-token"));
        Object result = null;
        try {
            result = pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        long end = System.currentTimeMillis();
        logger.info("請求耗時 {}",end-begin);
        logger.info("請求返回 {}",JSON.toJSON(result));
        logger.info("請求結束");

        return result;

    }

}

  

正常使用

    @ResLog(desc = "閱讀消息接口")
    @PostMapping ("/read")
    public Map read(@RequestBody Map resMap){
        return remindService.read(resMap);
    }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM