如何使用 Spring Boot 的应用程序日志(由 slf4j 生成)丰富 Jaeger opentracing 数据?
How to enrich Jaeger opentracing data with the application logs (produced by slf4j) for Spring Boot?
有一个现有的 Spring 启动应用程序正在使用 SLF4J 记录器。我决定通过标准 opentracing
API 添加对分布式跟踪的支持,并使用 Jaeger 作为跟踪器。初始设置如此简单真是令人惊讶 - 所需要的只是向 pom.xml
:
添加两个依赖项
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-autoconfigure</artifactId>
<version>${io.opentracing.version}</version>
</dependency>
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-core</artifactId>
<version>${jaegerVersion}</version>
</dependency>
并为 Tracer
bean 提供配置:
@Bean
public io.opentracing.Tracer getTracer() throws ConfigurationException {
return new new io.jaegertracing.Tracer.Builder("my-spring-boot-app").build();
}
一切都像魅力一样 - 应用程序请求由 Jaeger 处理并创建跨度:
但是,在 Logs
范围内,只有 preHandle
和 afterCompletion
事件包含有关在请求执行期间调用的 class / 方法的信息(无日志由 slf4j
记录器生成):
问题是是否可以将 Tracer 配置为获取应用程序记录器生成的日志(在我的情况下为 slf4j
),以便所有应用程序日志通过以下方式完成:LOG.info
/ LOG.warn
/ LOG.error
等也会反映在 Jaeger
注意:我已经弄清楚如何通过opentracing
API 手动 记录跨度,例如:
Scope scope = tracer.scopeManager().active();
if (scope != null) {
scope.span().log("...");
}
并使用 ERROR
标签进行一些 手动 操作,以便在过滤器中进行异常处理,例如
} catch(Exception ex) {
Tags.ERROR.set(span, true);
span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
throw ex
}
但是,我仍然想知道是否可以配置跟踪器来获取应用程序日志 automatically
:
LOG.info
-> 跟踪器将新日志添加到活动范围
LOG.error
-> 跟踪器将新日志添加到活动范围并添加 ERROR
标签
更新:我能够通过为记录器添加包装器将应用程序日志添加到跟踪器,例如
public void error(String message, Exception e) {
Scope scope = tracer.scopeManager().active();
if (scope != null) {
Span span = scope.span();
Tags.ERROR.set(span, true);
span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, e, Fields.MESSAGE, e.getMessage()));
}
LOG.error(message, e);
}
但是,到目前为止,我无法找到默认情况下允许将应用程序日志自动添加到跟踪器的 opentracing 配置选项。基本上,似乎预计开发人员会在需要时以编程方式向跟踪器添加额外的日志。此外,在对跟踪进行更多调查后,通常 logging
和 tracing
似乎是分开处理的,将所有应用程序日志添加到跟踪器并不是一个好主意(跟踪器应主要包括样本数据和标签请求身份证明)
https://github.com/opentracing-contrib/java-spring-cloud 项目自动将标准日志记录发送到活动跨度。只需将以下依赖项添加到您的 pom.xml
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-cloud-starter</artifactId>
</dependency>
或者如果您只需要日志记录集成,请使用此 https://github.com/opentracing-contrib/java-spring-cloud/tree/master/instrument-starters/opentracing-spring-cloud-core 启动器。
那我用opentracing-spring-jaeger-cloud-starter
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>2.0.0</version>
</dependency>
我在控制台中只有一行包含当前跟踪和跨度
i.j.internal.reporters.LoggingReporter:跨度报告:f1a264bbe2c7eae9:f1a264bbe2c7eae9:0:1 - my_method
2019-05-20 16:07:59.549 DEBUG 24428 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [632103eb] HTTP POST "/api"
2019-05-20 16:07:59.552 DEBUG 24428 --- [ctor-http-nio-2] s.w.r.r.m.a.RequestMappingHandlerMapping : [632103eb] Mapped to public reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<model.Response>> service.controller.method(model.Request)
2019-05-20 16:07:59.559 DEBUG 24428 --- [ctor-http-nio-2] .s.w.r.r.m.a.RequestBodyArgumentResolver : [632103eb] Content-Type:application/json
2019-05-20 16:08:01.450 INFO 24428 --- [ctor-http-nio-2] i.j.internal.reporters.LoggingReporter : Span reported: f1a264bbe2c7eae9:f1a264bbe2c7eae9:0:1 - method
2019-05-20 16:08:01.450 DEBUG 24428 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [632103eb] Completed 200 OK
那我用spring-cloud-starter-sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
我在每一行中得到了像 [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 这样的 Trace 和 Spans,这对 ELK 中的 filebeat 很有帮助
2019-05-20 16:15:38.646 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [3e578505] HTTP POST "/api"
2019-05-20 16:15:38.662 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Received a request to uri [/api]
2019-05-20 16:15:38.667 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Handled receive of span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:38.713 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] s.w.r.r.m.a.RequestMappingHandlerMapping : [3e578505] Mapped to public reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<model.Response>> service.controller.method(model.Request)
2019-05-20 16:15:38.727 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] .s.w.r.r.m.a.RequestBodyArgumentResolver : [3e578505] Content-Type:application/json
2019-05-20 16:15:39.956 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [gine-1-thread-1] .s.w.r.r.m.a.ResponseEntityResultHandler : Using 'application/json;charset=UTF-8' given [*/*] and supported [application/json;charset=UTF-8, application/*+json;charset=UTF-8, text/event-stream]
2019-05-20 16:15:40.009 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Adding a method tag with value [method] to a span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.009 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Adding a class tag with value [Controller] to a span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.010 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Handled send of NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.021 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [3e578505] Completed 200 OK
如何使用 opentracing-spring-jaeger-cloud-starter 获得相同的登录控制台?
我的 opentracing 配置
opentracing:
jaeger:
enabled: true
enable-b3-propagation: true
log-spans: true
const-sampler:
decision: true
http-sender:
url: http://jaeger-collector:14268/api/traces
以下是我将 Logback (Slf4j) 中的 jdbc 相关日志写入 Jaeger 服务器所做的工作:
从 Logback 配置开始 (logback-spring.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="consoleAppender" source="logging.console.enabled" defaultValue="false"/>
<property name="ENV" value="${SPRING_PROFILES_ACTIVE:-dev}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<jmxConfigurator/>
<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdc>true</includeMdc>
<customFields>{"log_type":"application","appname":"products-rs-load", "environment": "${ENV}"}
</customFields>
</encoder>
</appender>
<appender name="myAppender" class="com.test.MyAppender">
</appender>
<root level="DEBUG">
<appender-ref ref="myAppender"/>
</root>
<logger name="org.springframework.boot" level="INFO"/>
<logger name="p6spy" additivity="false" level="ALL">
<appender-ref ref="myAppender" />
</logger>
</configuration>
这是我的附加程序:
import ch.qos.logback.core.AppenderBase;
public class MyAppender extends AppenderBase {
@Override
protected void append(Object eventObject) {
LoggingEvent event = (LoggingEvent) eventObject;
final String loggerName = event.getLoggerName();
// only DB related operations have to be traced:
if (!("p6spy".equals(loggerName))) {
return;
}
/// Tracer config is straight forward
Span sp = TracingUtils.buildActiveChildSpan(loggerName, null);
if (Level.ERROR.equals(event.getLevel())) {
TracingUtils.setErrorTag(sp);
}
Map<String, String> fields = new HashMap<String, String>();
fields.put("level", event.getLevel().toString());
fields.put("logger", loggerName);
fields.put("content", event.getFormattedMessage());
sp.log(fields);
sp.finish();
}
}
正如已经指出的那样,一般来说,将所有日志都放在开发环境以外的任何 Jaeger 跟踪中是个坏主意 - 它可能会淹没 Jaeger。
同样,正如在最相关的 中回答的那样,opentracing-spring-cloud-core
库提供了这种能力。由参数控制
opentracing.spring.cloud.log.enabled
看看io/opentracing/contrib/spring/cloud/log/LoggingAutoConfiguration.java
此 bean 添加 SpanLogsAppender
到根记录器,这将向活动跨度添加日志。默认情况下,这将传播到所有其他记录器,除非某些记录器将 additivity
属性设置为 false
.
在我的应用程序中,com.mycompany.myapp 中的所有记录器都 additivity
错误,所以我必须为此创建解决方法。
我的解决方法是 运行 类似的逻辑,为我的应用程序的记录器“com.mycompany.myapp”添加 SpanLogsAppender,它将成为该包中所有 类 的父级:
package com.mycompany.myapp.config;
import ch.qos.logback.classic.Logger;
import io.opentracing.Tracer;
import io.opentracing.contrib.spring.cloud.log.SpanLogsAppender;
import io.opentracing.contrib.spring.tracer.configuration.TracerAutoConfiguration;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
@Configuration
@AutoConfigureAfter(TracerAutoConfiguration.class)
@ConditionalOnClass(ch.qos.logback.classic.Logger.class)
@ConditionalOnProperty(name = "opentracing.spring.cloud.log.enabled", havingValue = "true", matchIfMissing = true)
public class MyAppLoggingAutoConfiguration {
public MyAppLoggingAutoConfiguration(final Tracer tracer) {
SpanLogsAppender spanLogsAppender = new SpanLogsAppender(tracer);
spanLogsAppender.start();
Logger rootLogger = (Logger)LoggerFactory.getLogger("com.mycompany.myapp");
rootLogger.addAppender(spanLogsAppender);
}
}
这样,所有为位于包 com.mycompany.myapp
中任何深度的 类 创建的记录器都将获得额外的 SpanLogsAppender,它将日志放入当前范围。
有一个现有的 Spring 启动应用程序正在使用 SLF4J 记录器。我决定通过标准 opentracing
API 添加对分布式跟踪的支持,并使用 Jaeger 作为跟踪器。初始设置如此简单真是令人惊讶 - 所需要的只是向 pom.xml
:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-autoconfigure</artifactId>
<version>${io.opentracing.version}</version>
</dependency>
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-core</artifactId>
<version>${jaegerVersion}</version>
</dependency>
并为 Tracer
bean 提供配置:
@Bean
public io.opentracing.Tracer getTracer() throws ConfigurationException {
return new new io.jaegertracing.Tracer.Builder("my-spring-boot-app").build();
}
一切都像魅力一样 - 应用程序请求由 Jaeger 处理并创建跨度:
但是,在 Logs
范围内,只有 preHandle
和 afterCompletion
事件包含有关在请求执行期间调用的 class / 方法的信息(无日志由 slf4j
记录器生成):
问题是是否可以将 Tracer 配置为获取应用程序记录器生成的日志(在我的情况下为 slf4j
),以便所有应用程序日志通过以下方式完成:LOG.info
/ LOG.warn
/ LOG.error
等也会反映在 Jaeger
注意:我已经弄清楚如何通过opentracing
API 手动 记录跨度,例如:
Scope scope = tracer.scopeManager().active();
if (scope != null) {
scope.span().log("...");
}
并使用 ERROR
标签进行一些 手动 操作,以便在过滤器中进行异常处理,例如
} catch(Exception ex) {
Tags.ERROR.set(span, true);
span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
throw ex
}
但是,我仍然想知道是否可以配置跟踪器来获取应用程序日志 automatically
:
LOG.info
-> 跟踪器将新日志添加到活动范围LOG.error
-> 跟踪器将新日志添加到活动范围并添加ERROR
标签
更新:我能够通过为记录器添加包装器将应用程序日志添加到跟踪器,例如
public void error(String message, Exception e) {
Scope scope = tracer.scopeManager().active();
if (scope != null) {
Span span = scope.span();
Tags.ERROR.set(span, true);
span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, e, Fields.MESSAGE, e.getMessage()));
}
LOG.error(message, e);
}
但是,到目前为止,我无法找到默认情况下允许将应用程序日志自动添加到跟踪器的 opentracing 配置选项。基本上,似乎预计开发人员会在需要时以编程方式向跟踪器添加额外的日志。此外,在对跟踪进行更多调查后,通常 logging
和 tracing
似乎是分开处理的,将所有应用程序日志添加到跟踪器并不是一个好主意(跟踪器应主要包括样本数据和标签请求身份证明)
https://github.com/opentracing-contrib/java-spring-cloud 项目自动将标准日志记录发送到活动跨度。只需将以下依赖项添加到您的 pom.xml
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-cloud-starter</artifactId>
</dependency>
或者如果您只需要日志记录集成,请使用此 https://github.com/opentracing-contrib/java-spring-cloud/tree/master/instrument-starters/opentracing-spring-cloud-core 启动器。
那我用opentracing-spring-jaeger-cloud-starter
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>2.0.0</version>
</dependency>
我在控制台中只有一行包含当前跟踪和跨度 i.j.internal.reporters.LoggingReporter:跨度报告:f1a264bbe2c7eae9:f1a264bbe2c7eae9:0:1 - my_method
2019-05-20 16:07:59.549 DEBUG 24428 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [632103eb] HTTP POST "/api"
2019-05-20 16:07:59.552 DEBUG 24428 --- [ctor-http-nio-2] s.w.r.r.m.a.RequestMappingHandlerMapping : [632103eb] Mapped to public reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<model.Response>> service.controller.method(model.Request)
2019-05-20 16:07:59.559 DEBUG 24428 --- [ctor-http-nio-2] .s.w.r.r.m.a.RequestBodyArgumentResolver : [632103eb] Content-Type:application/json
2019-05-20 16:08:01.450 INFO 24428 --- [ctor-http-nio-2] i.j.internal.reporters.LoggingReporter : Span reported: f1a264bbe2c7eae9:f1a264bbe2c7eae9:0:1 - method
2019-05-20 16:08:01.450 DEBUG 24428 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [632103eb] Completed 200 OK
那我用spring-cloud-starter-sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
我在每一行中得到了像 [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 这样的 Trace 和 Spans,这对 ELK 中的 filebeat 很有帮助
2019-05-20 16:15:38.646 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [3e578505] HTTP POST "/api"
2019-05-20 16:15:38.662 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Received a request to uri [/api]
2019-05-20 16:15:38.667 DEBUG [my-service,,,] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Handled receive of span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:38.713 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] s.w.r.r.m.a.RequestMappingHandlerMapping : [3e578505] Mapped to public reactor.core.publisher.Mono<org.springframework.http.ResponseEntity<model.Response>> service.controller.method(model.Request)
2019-05-20 16:15:38.727 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] .s.w.r.r.m.a.RequestBodyArgumentResolver : [3e578505] Content-Type:application/json
2019-05-20 16:15:39.956 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [gine-1-thread-1] .s.w.r.r.m.a.ResponseEntityResultHandler : Using 'application/json;charset=UTF-8' given [*/*] and supported [application/json;charset=UTF-8, application/*+json;charset=UTF-8, text/event-stream]
2019-05-20 16:15:40.009 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Adding a method tag with value [method] to a span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.009 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Adding a class tag with value [Controller] to a span NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.010 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.c.s.instrument.web.TraceWebFilter : Handled send of NoopSpan(90e1114e35c897d6/90e1114e35c897d6)
2019-05-20 16:15:40.021 DEBUG [my-service,90e1114e35c897d6,90e1114e35c897d6,false] 12548 --- [ctor-http-nio-2] o.s.w.s.adapter.HttpWebHandlerAdapter : [3e578505] Completed 200 OK
如何使用 opentracing-spring-jaeger-cloud-starter 获得相同的登录控制台?
我的 opentracing 配置
opentracing:
jaeger:
enabled: true
enable-b3-propagation: true
log-spans: true
const-sampler:
decision: true
http-sender:
url: http://jaeger-collector:14268/api/traces
以下是我将 Logback (Slf4j) 中的 jdbc 相关日志写入 Jaeger 服务器所做的工作:
从 Logback 配置开始 (logback-spring.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="consoleAppender" source="logging.console.enabled" defaultValue="false"/>
<property name="ENV" value="${SPRING_PROFILES_ACTIVE:-dev}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<jmxConfigurator/>
<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdc>true</includeMdc>
<customFields>{"log_type":"application","appname":"products-rs-load", "environment": "${ENV}"}
</customFields>
</encoder>
</appender>
<appender name="myAppender" class="com.test.MyAppender">
</appender>
<root level="DEBUG">
<appender-ref ref="myAppender"/>
</root>
<logger name="org.springframework.boot" level="INFO"/>
<logger name="p6spy" additivity="false" level="ALL">
<appender-ref ref="myAppender" />
</logger>
</configuration>
这是我的附加程序:
import ch.qos.logback.core.AppenderBase;
public class MyAppender extends AppenderBase {
@Override
protected void append(Object eventObject) {
LoggingEvent event = (LoggingEvent) eventObject;
final String loggerName = event.getLoggerName();
// only DB related operations have to be traced:
if (!("p6spy".equals(loggerName))) {
return;
}
/// Tracer config is straight forward
Span sp = TracingUtils.buildActiveChildSpan(loggerName, null);
if (Level.ERROR.equals(event.getLevel())) {
TracingUtils.setErrorTag(sp);
}
Map<String, String> fields = new HashMap<String, String>();
fields.put("level", event.getLevel().toString());
fields.put("logger", loggerName);
fields.put("content", event.getFormattedMessage());
sp.log(fields);
sp.finish();
}
}
正如已经指出的那样,一般来说,将所有日志都放在开发环境以外的任何 Jaeger 跟踪中是个坏主意 - 它可能会淹没 Jaeger。
同样,正如在最相关的 opentracing-spring-cloud-core
库提供了这种能力。由参数控制
opentracing.spring.cloud.log.enabled
看看io/opentracing/contrib/spring/cloud/log/LoggingAutoConfiguration.java
此 bean 添加 SpanLogsAppender
到根记录器,这将向活动跨度添加日志。默认情况下,这将传播到所有其他记录器,除非某些记录器将 additivity
属性设置为 false
.
在我的应用程序中,com.mycompany.myapp 中的所有记录器都 additivity
错误,所以我必须为此创建解决方法。
我的解决方法是 运行 类似的逻辑,为我的应用程序的记录器“com.mycompany.myapp”添加 SpanLogsAppender,它将成为该包中所有 类 的父级:
package com.mycompany.myapp.config;
import ch.qos.logback.classic.Logger;
import io.opentracing.Tracer;
import io.opentracing.contrib.spring.cloud.log.SpanLogsAppender;
import io.opentracing.contrib.spring.tracer.configuration.TracerAutoConfiguration;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
@Configuration
@AutoConfigureAfter(TracerAutoConfiguration.class)
@ConditionalOnClass(ch.qos.logback.classic.Logger.class)
@ConditionalOnProperty(name = "opentracing.spring.cloud.log.enabled", havingValue = "true", matchIfMissing = true)
public class MyAppLoggingAutoConfiguration {
public MyAppLoggingAutoConfiguration(final Tracer tracer) {
SpanLogsAppender spanLogsAppender = new SpanLogsAppender(tracer);
spanLogsAppender.start();
Logger rootLogger = (Logger)LoggerFactory.getLogger("com.mycompany.myapp");
rootLogger.addAppender(spanLogsAppender);
}
}
这样,所有为位于包 com.mycompany.myapp
中任何深度的 类 创建的记录器都将获得额外的 SpanLogsAppender,它将日志放入当前范围。