Spring Cloud H SR5 集成Jaeger

该文章主要讲述Spring Cloud H SR5集成 opentracing-spring-jaeger-cloud-starter 3.1.2

依赖引入

        <dependency><groupId>io.opentracing.contrib</groupId><artifactId>opentracing-spring-jaeger-cloud-starter</artifactId><version>3.1.2</version></dependency>

日志格式

很多小伙伴都是从zipkin改用jaeger,因为使用zipkin需要集成sleuth,而sleuth是符合大部分人的需求的,因为它的日志格式很方便日志采集,后续可以根据服务名进行过滤.所以接下讲述如何修改jaeger的日志格式.

logback

首先配置logback

<?xml version="1.0" encoding="UTF-8"?><!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
​<property resource="bootstrap.yml" />
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /><conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(%5p [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- Console 输出设置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder>
</appender><!-- 定义日志级别 -->
<property name="log.level" value="INFO" /><!-- 定义日志文件名称,注意修改此处!!! -->
<property name="log.name" value="tdf-service-sys" /><!-- 定义日志文件的存储地址 -->
<!-- <property name="log.path" value="/app/wo_sale/servers/logs/${log.name}" /> -->
<property name="log.path" value="/opt/logs/tdf-cloud/${log.name}" /><!-- 定义日志文件名格式化 -->
<property name="log.timeFormat" value="yyyy-MM-dd" /><!-- 定义日志文件的输出格式。%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%logger{50} 表示logger名字最长50个字符,否则按照句点分割。%msg:日志消息,%n是换行符 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /><!-- 定义日志文件保留天数 -->
<property name="log.maxHistory" value="30" /><!-- 定义日志文件最大限制 -->
<property name="log.maxFileSize" value="10MB" /><!-- 控制台输出 -->
<!-- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${log.pattern}</pattern></encoder>
</appender> --><!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件,并按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/${log.name}.log</file><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${log.level}</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--    滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动%i:当文件大小超过maxFileSize时,按照i进行文件滚动--><FileNamePattern>${log.path}/${log.name}.%d{${log.timeFormat}}-%i.log</FileNamePattern><MaxHistory>${log.maxHistory}</MaxHistory><TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>${log.maxFileSize}</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder>
</appender><!-- 按照每天生成日志文件。仅记录错误日志 -->
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/${log.name}_error.log</file><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.path}/error/${log.name}_error.%d{${log.timeFormat}}-%i.log</FileNamePattern><MaxHistory>${log.maxHistory}</MaxHistory><TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>${log.maxFileSize}</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder>
</appender><!-- 日志输出级别,root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 -->
<root level="${log.level}"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /><appender-ref ref="FILE-ERROR" />
</root>
</configuration>

请注意xml中的 CONSOLE_LOG_PATTERN 该日志正则表达式可以让日志想sleuth一样,但有些问题就是有一些字段logback是获取不到的,所以需要手动的将缺失字段放到logback的上下文中代码如下.之前我也写过集成jager的文章但是因为jager的版本升级,老方法不能再使用.

MDC

手动将缺失字段,方式logback上下文


import io.jaegertracing.internal.JaegerSpanContext;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.util.ThreadLocalScopeManager;
import org.slf4j.MDC;public class MDCScopeManager extends ThreadLocalScopeManager {@Overridepublic Scope activate(Span span) {Scope activate = super.activate(span);mdc(span);return activate;}public void mdc(Span span){JaegerSpanContext ctx = (JaegerSpanContext) span.context();String traceId = ctx.getTraceId();String spanId = Long.toHexString(ctx.getSpanId());String sampled = String.valueOf(ctx.isSampled());String parentSpanId = Long.toHexString(ctx.getParentId());replace("X-B3-TraceId", traceId);replace("X-B3-SpanId", spanId);replace("parentSpanId", parentSpanId);replace("X-Span-Export", sampled);}private static String lookup(String key) {return MDC.get(key);}private static void replace(String key, String value) {if (value == null) {MDC.remove(key);} else {MDC.put(key, value);}}
}

TracerBuilderCustomizer

该类的作用是将上述MDC代码放到jaeger中,为的就是从jeager上下文中获取需要的确实变量,最后放到logback上下文

import io.opentracing.contrib.java.spring.jaeger.starter.TracerBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class Config {@Beanpublic TracerBuilderCustomizer mdcBuilderCustomizer() {return builder -> builder.withScopeManager(new MDCScopeManager());}
}

配置

opentracing:jaeger:enabled: truelog-spans: true
#    const-sampler:   #常量
#      decision: trueprobabilistic-sampler:  #抽样sampling-rate: 0.5udp-sender:host: localhostport: 6831

代码地址

https://github.com/ChenZheOnePiece/cloudjaeger.git

Spring Cloud H SR5集成 Jaeger相关推荐

  1. 【java_wxid项目】【第十六章】【Spring Cloud Alibaba Sentinel集成】

    主项目链接:https://gitee.com/java_wxid/java_wxid 项目架构及博文总结: 点击:[使用Spring Boot快速构建应用] 点击:[使用Spring Cloud O ...

  2. 【java_wxid项目】【第七章】【Spring Cloud Security Oauth2集成】

    主项目链接:https://gitee.com/java_wxid/java_wxid 项目架构及博文总结: 点击:[使用Spring Boot快速构建应用] 点击:[使用Spring Cloud O ...

  3. Spring Cloud Dalston.SR5 BUG一记

    使用Dalston.SR5版本的Zuul时, 发现Ribbon重试不能切换服务实例, 换成Edgware.SR3,同样的配置可以切换实例进行重试 还有个不升级所有Spring Cloud组件的方法,仅 ...

  4. spring cloud sream 统一集成mq中间件

    spring cloud sream: 一个通道(入,出)对应一个主题 入,出对应于服务将 出通道---队列---入通道 binder :集成任意消息中间件的组件--建立连接,集成多个kafka就用多 ...

  5. Spring Cloud H (五)初战服务降级和熔断Hystrix(豪猪哥)

    目录 目录 前言 概述 服务雪崩 服务限流 服务降级 服务熔断 如何理解服务降级和熔断之间的关系 代码实战 Hystrix支付微服务构建 订单微服务调用支付服务出现卡顿 Hystrix之服务降级支付侧 ...

  6. Spring Cloud 微服务集成整理

    SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency>     <groupId>org.springframework.clo ...

  7. spring cloud 文件服务器,SpringBoot集成MinIO文件服务器

    docker-compose安装minio version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/minio:late ...

  8. Spring Cloud H (二)服务注册中心 Zookeeper

    目录 前言 一.Zookeeper数据结构 二.统一配置管理 三.统一命名服务 四.Zookeeper安装启动 五.zoo.conf参数解读 六.集群搭建 七.Zookeeper Session 为什 ...

  9. Spring cloud系列十八 Spring Cloud 从Dalston.SR5到Greenwich.SR1 的升级记录

    背景 项目之前一直使用Spring Cloud Dalston.SR5,但是此版本2018年12月软件生命周期要结束,为了后续安全和维护的需要,需要将对版本进行升级.先从官网上分析D版本的后续版本的变 ...

最新文章

  1. 【JavsScript】推荐五款流行的JavaScript模板引擎
  2. linux c 取消宏定义
  3. Java虚拟机性能管理神器 - VisualVM(2) 入门
  4. 2.1.5编码与调制(1)
  5. jdbc dao 工具类mysql_Java基于JDBC实现事务,银行转账及货物进出库功能示例
  6. 1071元!苹果上架iPhone 11系列智能电池壳:可充电、支持拍照
  7. java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
  8. NSGA-II资料合集
  9. 如何root安卓手机_2019年安卓手机一键root教程,附科普安卓为何root困难?
  10. 【优化系列】VS与YASM的集成使用
  11. python保存路径_Python模块的正确存放位置
  12. LPVOID 指针 转 int
  13. 制作u盘winpe启动盘_干货| 如何制作U盘启动盘安装操作系统
  14. STAT0023 STATISTICS FOR PRACTICAL COMPUTING
  15. FME教程:GIS建筑面转CAD格式JMD,还原房屋建筑结构、层数、地物样式,shp转CAD,GIS转dwg
  16. 板内盘中孔设计狂飙,细密间距线路中招
  17. 860-什么是MTU?
  18. java基础-RSA签名验签
  19. 阿里云云服务器ECS简单使用
  20. 多模态 Generalized Visual Language Models

热门文章

  1. 元账户层是进入Web3元宇宙的传送门
  2. 区别:过去完成时、现在完成时、一般过去时
  3. sql 取第一条数据
  4. 计算机科学大师唐纳德,他是现代计算机科学的鼻祖,编程界的上帝
  5. CHIL-ORACLE-循环 语法
  6. “OSError: [WinError 1455]页面文件太小,无法完成操作。”解决方案
  7. Stage 222222 —— 逆向工程拆除“二进制炸弹”程序
  8. 台湾地震,微软遭罪。
  9. 百度文库----免费复制
  10. CSS立体文字和电子数字样式数字大屏数字