Trace
1. 注册filter
package com.sc.account.config;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<TraceFilter> traceFilterRegistration() {FilterRegistrationBean<TraceFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new TraceFilter());registration.addUrlPatterns("/*");registration.setName("TraceFilter");registration.setOrder(100011); // 可设置优先级return registration;}
}
2.创建注册的filter
package com.sc.account.config;import cn.hutool.core.util.IdUtil;
import com.common.result.TraceUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class TraceFilter extends OncePerRequestFilter {public static Logger logger = LoggerFactory.getLogger(TraceFilter.class);@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String tranceId = IdUtil.fastSimpleUUID();TraceUtils.setTraceId(tranceId);logger.info("请求路径start:{}", request.getRequestURI());long start = System.currentTimeMillis();try {filterChain.doFilter(request, response);} finally {long end = System.currentTimeMillis();logger.info("请求end:{},耗时:{}", request.getRequestURI(),(start - end));TraceUtils.removeTraceId();}}
}
3.ControllerLogAspect 打印请求 参数 和返回值
package com.sc.account.config;import cn.hutool.json.JSONUtil;
import org.aspectj.lang.ProceedingJoinPoint;
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.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import java.util.LinkedHashMap;
import java.util.Map;@Aspect
@Component
@Order(10002)
public class ControllerLogAspect {
private Logger loger = LoggerFactory.getLogger(ControllerLogAspect.class);@Around("execution(* com.sc.account.domain.index.controller..*.*(..))")public Object around(ProceedingJoinPoint joinPoint){long start = System.currentTimeMillis();MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Object result = null;try {loger.info("接口方法:{},{}",methodSignature.getDeclaringTypeName(),methodSignature.getName());Map<String, Object> logParamMap = new LinkedHashMap<>();String[] parameterNames = methodSignature.getParameterNames();Object[] args = joinPoint.getArgs();for (int i = 0; i < args.length; i++) {String parameterName = parameterNames[i];Object parameterValue = args[i];logParamMap.put(parameterName, parameterValue);}loger.info("接口入参:{}", JSONUtil.toJsonStr(logParamMap));result = joinPoint.proceed();return result;} catch (Throwable e) {throw new RuntimeException(e);}finally {loger.info("方法返回值:{}",JSONUtil.toJsonStr(result));}}}
4. logback.xml加上
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder charset="UTF-8"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [traceId:%X{traceId}] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder>
</appender>