SpringCloud统一打印请求日志(MethodInterceptor实现方式)

一、背景

在java web项目中,打印请求参数能帮我们定位问题,这里提供众多方案中的一种,建议收藏。

二、实现方案

添加aop依赖

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

重写MethodInterceptor拦截器invoke方法

mport lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import javax.annotation.Nonnull;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Slf4j
public class MyInterceptor implements MethodInterceptor {


    @Override
    public Object invoke(@Nonnull MethodInvocation invocation) throws Throwable {
        Method[] methods = Object.class.getMethods();
        for (Method m : methods) {
            if (invocation.getMethod().equals(m)) {
                return null;
            }
        }
        List<Object> parameters = getArguments(invocation);
        HttpServletRequest httpServletRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        log.info("请求地址:{} ", httpServletRequest.getRequestURL());
        log.info("请求方式:{} ", httpServletRequest.getMethod());
        log.info("请求参数:{}",  parameters);
        Objects obj = invocation.proceed();
        log.info("请求结果:{}",  JSONObject.toJSONString(obj));
        return obj;
    }

    protected List<Object> getArguments(MethodInvocation invocation) {
        Object[] arguments = invocation.getArguments();
        if (arguments.length == 0) {
            return Collections.emptyList();
        }
        return Arrays.asList(arguments);
    }
}

配置拦截切面

import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class InterceptorConfig {
    //注意该地址为项目具体包地址
    public static final String traceExecution = "execution(* com.zzx.demo.controller..*.*(..))";
    @Bean
    public DefaultPointcutAdvisor defaultPointcutAdvisor2() {
        MyInterceptor interceptor = new MyInterceptor();
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(traceExecution);

        // 配置增强类advisor
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
        advisor.setPointcut(pointcut);
        advisor.setAdvice(interceptor);
        return advisor;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值