springboot sleuth 日志跟踪

Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具。使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中。当我们在这些应用中来诊断问题时,即使有日志记录也很难判断出一个请求需要将哪些操作关联在一起。

如果想要诊断复杂操作,通常的解决方案是在请求中传递唯一的ID到每个方法来识别日志。而Sleuth可以与日志框架Logback、SLF4J轻松地集成,通过添加独特的标识符来使用日志跟踪和诊断问题。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

SLF4J 配置 https://www.cnblogs.com/baobaoxiaokeai/p/11017329.html 

在使用slf4j打印日志时会打印traceId,通过这ID可以把整个请求链给找出来.

如下是打印出来的实例

2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1] 

需要把traceId给前端,使用aop,在每个返回结果中增加traceId字段

 

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

posted on 2019-06-19 17:29  xiaogui918  阅读(4895)  评论(0编辑  收藏  举报

导航