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 对每个请求 参数 和 响应结果 进行日志打印的主要内容,如果未能解决你的问题,请参考以下文章