Spring Cloud H SR5集成 Jaeger

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 {

    @Override
    public 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 {
    @Bean
    public TracerBuilderCustomizer mdcBuilderCustomizer() {
        return builder -> builder.withScopeManager(new MDCScopeManager());
    }
}

配置

opentracing:
  jaeger:
    enabled: true
    log-spans: true
#    const-sampler:   #常量
#      decision: true
    probabilistic-sampler:  #抽样
      sampling-rate: 0.5
    udp-sender:
      host: localhost
      port: 6831

代码地址

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

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值