Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具。使用Sleuth库能够应用于计划任务 、多线程服务或复杂的Web请求,尤为是在一个由多个服务组成的系统中。当咱们在这些应用中来诊断问题时,即便有日志记录也很难判断出一个请求须要将哪些操做关联在一块儿。html
若是想要诊断复杂操做,一般的解决方案是在请求中传递惟一的ID到每一个方法来识别日志。而Sleuth能够与日志框架Logback、SLF4J轻松地集成,经过添加独特的标识符来使用日志跟踪和诊断问题。前端
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>2.1.1.RELEASE</version> </dependency>
SLF4J 配置 http://www.javashuo.com/article/p-rhncmqhv-hd.html java
在使用slf4j打印日志时会打印traceId,经过这ID能够把整个请求链给找出来.web
以下是打印出来的实例spring
2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1]
须要把traceId给前端,使用aop,在每一个返回结果中增长traceId字段json
import brave.Tracer; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.google.gson.Gson; import org.slf4j.Logger; import org.slf4j.LoggerFactory;;import javax.servlet.http.HttpServletRequest; @Aspect //定义一个切面 @Configuration @Slf4j public class TraceAspect { // 定义切点Pointcut @Pointcut("execution(* com.gf.controller..*.*(..))") public void excudeService() { } @Autowired Tracer tracer; @Around("excudeService()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest(); String url = request.getRequestURL().toString(); String method = request.getMethod(); String uri = request.getRequestURI(); String queryString = request.getQueryString(); log.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString); // result的值就是被拦截方法的返回值 Object result = pjp.proceed(); JSONObject dd = JSONObject.parseObject(JSON.toJSONString(result)); dd.put("traceId",tracer.currentSpan().context().traceIdString()); log.info("请求结束,controller的返回值是 {} - {}", tracer.currentSpan().toString(), dd.toJSONString()); return dd; } }
转载自:https://blog.csdn.net/peterwanghao/article/details/79967634多线程