srpingboot 对每个请求 参数 和 响应结果 进行日志打印

Posted 小污龟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了srpingboot 对每个请求 参数 和 响应结果 进行日志打印相关的知识,希望对你有一定的参考价值。

HttpAspect.java

注意这里需要改成拦截对包:
@Pointcut("execution(* cn.rc.api..*.*(..))") public void log() {}
package cn.rc.common.filter;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.aspectj.lang.JoinPoint;
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.text.SimpleDateFormat;
import java.util.*;

@Aspect
@Component
public class HttpAspect {

    public static ThreadLocal<Map<String,Object>> requsetLogKey = new ThreadLocal();

    /**
     * 这样写是将重复的代码提取出来方便处理
     */
    @Pointcut("execution(* cn.rc.api..*.*(..))")
    public void log() {}


    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        Date d=new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date=simpleDateFormat.format(d);

        StringBuffer url=request.getRequestURL();
        String method=request.getMethod();
        String ip=request.getRemoteAddr();
        String class_method=joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName();
        Object[] args=joinPoint.getArgs();
        String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();//参数名


        //记录请求耗时
        //生成一个随机字符串
        String key= RandomStringUtils.randomAlphanumeric(10);
        //存入ThreadLocal,当controller方法执行完,或者报错的时候,可以查看到是哪个请求
        long start = System.currentTimeMillis();
        Map map=new HashMap();
        map.put("requestKey",key);
        map.put("currentTime",start);
        map.put("class_method",class_method);

        requsetLogKey.set(map);

        StringBuffer s=new StringBuffer();
        s.append(date+":   ");
        s.append("url="+url+"    ");
        s.append("method="+method+"    ");
        s.append("ip="+ip+"    ");
        s.append("class_method="+class_method+"    ");
        List a=new ArrayList<>();
        for (int i =0;i<argNames.length;i++){
            String n= argNames[i];
            String v="";
            if(args[i]!=null){
                v=(args[i]).toString();
            }else{
                v="null";
            }
            a.add(n+"="+v);
        }
        s.append("args="+ ArrayUtils.toString(a)+"    ");

        System.out.println("[requestKey::"+key+"]--"+s.toString() );
    }


    /*@After("log()")
    public void doAfter() {
        System.out.println("方法正常完成!");
    }*/

    @AfterReturning(returning = "obj",pointcut = "log()")
    public void doAfterReturning(Object obj) {
        String resultJson = JSONObject.toJSONString(obj);

        //计算方法请求耗时
        Map map=requsetLogKey.get();
        requsetLogKey.remove();
        String key=(String)map.get("requestKey");
        Long startTime=(Long)map.get("currentTime");
        long elapseTime = System.currentTimeMillis() - startTime;
        String class_method=(String)map.get("class_method");//执行的方法路径

        System.out.println("[requestKey::"+key+"]--responseSucceeded:"+resultJson );
        System.out.println("[requestKey::"+key+"]--method"+class_method+"--耗时:"+elapseTime);
    }

    @AfterThrowing(throwing="ex",pointcut="log()")
    public void doRecoveryActions(Throwable ex) {

        //计算方法请求耗时
        Map map=requsetLogKey.get();
        requsetLogKey.remove();
        String key=(String)map.get("requestKey");
        Long startTime=(Long)map.get("currentTime");
        long elapseTime = System.currentTimeMillis() - startTime;
        String class_method=(String)map.get("class_method");//执行的方法路径
        System.out.println("[requestKey::"+key+"]--error"+ex );
        System.out.println("[requestKey::"+key+"]--requestErrorMethod"+class_method+"--耗时:"+elapseTime );
    }
}

 

 

 

调用接口:

 

以上是关于srpingboot 对每个请求 参数 和 响应结果 进行日志打印的主要内容,如果未能解决你的问题,请参考以下文章

WebService发布协议--SOAP和REST的区别

用 jQuery.ajaxSetup 实现对请求和响应数据的过滤

http,soap and rest

Flask请求-响应循环

Gin-API系列请求和响应参数的检查绑定

怎样用JAVA实现模拟HTTP请求,得到服务器的响应时间等参数