栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

AOP获取请求接口所有信息(入参类型、参数、执行时间、当前方法路径、响应参数、响应数据类型)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AOP获取请求接口所有信息(入参类型、参数、执行时间、当前方法路径、响应参数、响应数据类型)

日志输出实体

package com.log;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;
import java.util.Map;

@Data
@AllArgsConstructor
public class LiveLog {
    // 请求路径
    private String requestPath;
    // 请求方法
    private String requestMethod;
    // 当前的时间戳
    private Long currentTimeMills;
    // 参数类型
    private Map argsType;
    // 所有入参
    private List allArgs;
    // 响应数据
    private String responseData;
    // 当前执行耗时
    private String executeTimeMills;
    // 当前请求的方法路径:(类路径 + 方法名字)
    private String classMethodLocation;
    // 请求的IP
    private String remoteAddr;
    // 当前日期(yyyy-MM-dd HH:mm:ss)
    private String nowTime;
    // 响应数据类型
    private String responseType;
}

 

AOP切面类

package com.log.aspect;

import com.alibaba.fastjson.JSONObject;
import com.cmb.live.log.LiveLog;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
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.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Aspect
@Component
@Slf4j
public class LiveLogAspect {


    @Pointcut(value = "execution(public * com.controller.*.*(..))") // 切点
    private void controllerPointCut() {
    }


    @Around(value = "controllerPointCut()")
    private Object Around(ProceedingJoinPoint proceedingJoinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        Long startTime = System.currentTimeMillis();// 步入时间戳
        MethodSignature method = (MethodSignature) proceedingJoinPoint.getSignature();
        Class currentClass = proceedingJoinPoint.getTarget().getClass();
        Object proceed = null;
        try {
            proceed = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        log.info(JSONObject.toJSONString(new LiveLog(request.getRequestURI(), request.getMethod(), startTime,
                getMethodArgumentTypeName(method), Arrays.asList(proceedingJoinPoint.getArgs()), proceed.toString(),
                (System.currentTimeMillis() - startTime) + "ms", currentClass.getName() + "." + method.getName(),
                request.getRemoteAddr(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), method.getReturnType().getName())));
        return proceed;
    }

    @AfterThrowing(value = "controllerPointCut()")
    private void AfterThrowing() {
        System.out.println("异常通知");
    }

    private Map getMethodArgumentTypeName(MethodSignature method) {
        Map map = new HashMap<>();
        String[] argTypeNames = method.getParameterNames();
        Class[] parameterTypes = method.getParameterTypes();
        for (int i = 0; i < parameterTypes.length; i++) {
            map.put(parameterTypes[i].getName(), argTypeNames[i]);
        }
        return map;
    }
}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号