ZipKin原理学习--zipkin支持日志打印追踪信息

     目前在zipkin brave已经提供功能在我们使用logback或log4j等时可以在日志信息中将traceId和spanId等信息打印到运行日志,这样可能对我们通过日志查看解决问题有比较大的帮助。
  
  示例:
  
  pom.xml中添加zipkin相关jar
  
  <dependency>
  
   <groupId>io.zipkin.brave</groupId>
  
   <artifactId>brave-instrumentation-spring-web</artifactId>
  
   <version>5.4.3</version>
  
   </dependency>
  
  <dependency>
  
  <groupId>io.zipkin.brave</groupId>
  
  <artifactId>brave</artifactId>
  
  <version>5.4.3</version>
  
  </dependency>
  
  <dependency>
  
  <groupId>io.zipkin.brave</groupId>
  
  <artifactId>brave-context-slf4j</artifactId>
  
  <version>5.4.3</version>
  
  </dependency>
  
   <dependency>
  
   <groupId>io.zipkin.brave</groupId>
  
   <artifactId>brave-instrumentation-spring-webmvc</artifactId>
  
   <version>5.4.3</version>
  
   </dependency>
  
  注入zip相关bean:
  
  Configuration
  
  @Import({
  
  TracingClientHttpRequestInterceptor.class,
  
  SpanCustomizingAsyncHandlerInterceptor.class
  
  })
  
  public class TracingConfiguration extends WebMvcConfigurerAdapter {
  
  @Bean
  
  public DelegatingTracingFilter getDelegatingTracingFilter() {
  
  return new DelegatingTracingFilter();
  
  }
  
  @Bean
  
  Sender sender() {
  
   return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans");
  
  }
  
  @Bean
  
  AsyncReporter<Span> spanReporter() {
  
   return AsyncReporter.create(sender());
  
  }
  
  @Bean
  
  Tracing tracing(@Value("${zipkin.service:brave-webmvc-example}") String serviceName) {
  
   return Tracing.newBuilder()
  
  .localServiceName(serviceName)
  
  .propagationFactory(ExtraFieldPropagation.newFactory(B3Propagation.FACTORY, "user-name"))
  
  .spanReporter(spanReporter()).currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
  
  //添加日志相关的处理器
  
  .addScopeDecorator(MDCScopeDecorator.create()).build()).build();
  
  }
  
  @Bean
  
  HttpTracing httpTracing(Tracing tracing) {
  
   return HttpTracing.create(tracing);
  
  }
  
  @Autowired
  
  TracingClientHttpRequestInterceptor clientInterceptor;
  
  @Bean
  
  public RestTemplate restTemplate() {
  
   RestTemplate restTemplate = new RestTemplate();
  
   List<ClientHttpRequestInterceptor> interceptors =new ArrayList<>(restTemplate.getInterceptors());
  
   interceptors.add(clientInterceptor);
  
   restTemplate.setInterceptors(interceptors);
  
   return restTemplate;
  
  }
  
  @Autowired
  
  SpanCustomizingAsyncHandlerInterceptor serverInterceptor;
  
  @Override
  
  public void addInterceptors(InterceptorRegistry registry) {
  
   registry.addInterceptor(serverInterceptor);
  
  }
  
  }
  
  运行日志:
  
  @RequestMapping("start")
  
  public String start(HttpServletRequest request1,HttpServletResponse response1) throws InterruptedException, IOException {
  
  logger.info("start");
  
  String data = restTemplate.getForObject("http://localhost:9090/foo", String.class);
  
  return data;
  
  }
  
  logback.xml相关配置:
  
  主要添加这个打印格式:
  
  <property name="CONSOLE_LOG_PATTERN" value="%d [%X{traceId}/%X{spanId}] [%thread] %-5level %logger{36} - %msg%n"/>
  
  logback.xml示例:
  
  <?xml version="1.0" encoding=www.dasheng178.com/"UTF-8"?>
  
  <configuration>
  
  <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
  
  <springProperty scope="context" name="springAppName" source="spring.application.name"/>
  
  <!-- Example for logging into the build folder of your project -->
  
  <property name="LOG_FILE" value="logs\\${springAppName}.log"/>?
  
  <!-- You can override this to have a custom pattern www.mcyllpt.com-->
  
  <property name="CONSOLE_LOG_PATTERN" value="%d [%X{traceId}/%X{spanId}] [%thread] %-5level %logger{36} - %msg%n"/>
  
  <!-- Appender to log to console -->
  
  <appender name="console"www.ysyl157.com class="www".hjylp178.com"ch.qos.logback.core.ConsoleAppender">
  
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  
  <!-- Minimum logging level to be presented in the console logs-->
  
  <level>INFO</level>
  
  </filter>
  
  <encoder>
  
  <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  
  <charset>utf8</charset>
  
  </encoder>
  
  </appender>
  
  <!-- Appender to log to file -->?
  
  <appender name=www.yigouyule2.cn "flatfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  
  <file>${LOG_FILE}</file>
  
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  
  <fileNamePattern>${LOG_FILE}.www.hengy178.com%d{yyyy-MM-dd}.gz</fileNamePattern>
  
  <maxHistory>7</maxHistory>
  
  </rollingPolicy>
  
  <encoder>
  
  <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  
  <charset>utf8</charset>
  
  </encoder>
  
  </appender>
  
  <root level="INFO"www.120xh.cn>
  
  <appender-ref ref="console"/>
  
  <!-- uncomment this to have also JSON logs -->
  
  <appender-ref ref="flatfile"/>
  
  </root>
  
  </configuration>
  
  日志打印信息:
  
  2018-10-20 21:24:28,656 [af49581a0f632677/af49581a0f632677] [http-nio-8080-exec-1] INFO c.t.controller.HomeController - start

原文地址:https://www.cnblogs.com/qwangxiao/p/9943594.html

时间: 2024-11-29 12:30:30

ZipKin原理学习--zipkin支持日志打印追踪信息的相关文章

Zipkin原理学习--日志追踪 MySQL 执行语句

目前Zipkin官方提供了插件用于支持对MySQL语句执行过程的日志追踪,提供了对MySQL5.MySQL6和MySQL8的支持,官方地址:https://github.com/openzipkin/brave/tree/master/instrumentation 一.介绍及示例配置示例: 1.引入相关jar包: <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-instru

python日志,支持彩色打印和文件大小切片写入和写入mongodb

支持不同logger name的日志写入不同的文件,不同logger name日志写入不同的mongodb 的collection.LogManager比较容易调用,因为里面的内部方法全都使用了下划线,使用了下划线的就是保护和私有方法不需要外界调用,也不需要看懂他,在调用时候pycharm不会自动补全提示这些带下划线的无关方法了,只暴露了get_and_add_handlers和get_without_handlers两个可能需要调用的方法,pyrcharm可以自动补全这两个方法. 主要思路和模

grp/从Zipkin到Jaeger,Uber的分布式追踪之道tchannel--zipkin with mysql in docker-compose

GRPC----http://www.cnblogs.com/ghj1976/p/4587736.html https://blog.csdn.net/fei33423/article/details/79452948 zipkin with mysql in docker-compose https://my.oschina.net/u/3020542/blog/1613016[Docker Compose 搭建基于mysql存储的zipkin环境 ] https://github.com/o

计算机原理学习(7)-- x86-32 CPU和内存管理之分段管理

前言 前一篇我们介绍了内存管理中的分页试内存管理,分页的主要作用就是使得每个进程有一个独立的,完整的内存空间,通过虚拟内存技术,使得程序可以在较小的内存上运行,而进程之间内存空间相互独立,提高了安全性.这一篇将主要介绍内存管理中分段管理,以及两种的结合,也是目前计算机普遍采用的段页式内存管理.这也直接决定了的后面程序的编译,加载以及允许时的内存布局. 1. 内存分段 1.1 为什么分段? 在x86-16体系中,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理.而CPU则使用CS

学习、沟通日志(6-27)

总览 一.目前需学习的项目: 2.             系统标准功能操作 3.             配置完成以后的系统功能操作 二.学习完成的项目: 4.             存储过程第1类——用于进行SBO表单控制的存储过程,对表单增删改查等操作之前会触发一个存储过程,在存储过程中写代码可对表单提交的数据进行检验,从而进行简单的控制. 5.             格式化搜索——将激活页面控件的值取出来,以作为SQL操作的条件. 注:存储过程和格式化搜索是SBO高级配置的最重要内容

python日志打印和写入并发简易版本实现

大家一般都用logging日志打印,但logging是线程安全的,多进程也有很多介绍,引入一些文件锁,对logging做好配置,能过支持. 但通过测试,发现多进程时还是容易出现重复写入文件或者打印正常漏写入文件的问题. 我的日志需求比较简单,能够区分文件,正确的写入日志文件. 引入文件锁:日志写入函数封装到一个操作_Logger类中: 日志名称和写入级别封装到一个业务类Logger中. 本范例基于python3实现.本范例20个进程并发,分别写入3个文件,每s每个文件写入超过100行数据,日志文

编译原理学习导论

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理却一直作为大学本科的必修课程,同一时候也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然因为这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,只是讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比較专注解决一种的算法了.在20世纪50年代,编译器的编写一直被觉得是十分困难的事情

学习、沟通日志(7-2)

总览 一.目前需学习的项目: 2.       配置完成以后的系统功能操作 6.       前期配置项要梳理.汇总 7.       前期梳理的业务流程再仔细.逐个的看一遍,保证业务蓝图工作的质量 二.学习完成的项目: 3.             存储过程第1类——用于进行SBO表单控制的存储过程,对表单增删改查等操作之前会触发一个存储过程,在存储过程中写代码可对表单提交的数据进行检验,从而进行简单的控制. 4.             格式化搜索——将激活页面控件的值取出来,以作为SQL操

学习、沟通日志(7-3)

总览 一.目前需学习的项目: 2.             配置完成以后的系统功能操作 6.       前期配置项要梳理.汇总 7.       前期梳理的业务流程再仔细.逐个的看一遍,保证业务蓝图工作的质量 二.学习完成的项目: 3.             存储过程第1类——用于进行SBO表单控制的存储过程,对表单增删改查等操作之前会触发一个存储过程,在存储过程中写代码可对表单提交的数据进行检验,从而进行简单的控制. 4.             格式化搜索——将激活页面控件的值取出来,以