将 Spring Boot Profile 添加到 Sleuth/Zipkin 日志

Posted

技术标签:

【中文标题】将 Spring Boot Profile 添加到 Sleuth/Zipkin 日志【英文标题】:Add Spring Boot Profile to Sleuth/Zipkin logs 【发布时间】:2017-08-03 11:52:40 【问题描述】:

我正在使用这些依赖项:

compile 'org.springframework.cloud:spring-cloud-starter-zipkin'
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
compile 'org.springframework.cloud:spring-cloud-sleuth-zipkin'

是否可以将当前活动配置文件添加到每个日志行?这样就可以根据 Splunk/ELK/... 中的配置文件过滤日志。

所以不是

2017-03-13 13:38:30.465  INFO [app,,,] 19220 --- [           main] com.company.app.Application    : Started Application in 20.682 seconds (JVM running for 22.166)

它应该记录

2017-03-13 13:38:30.465  INFO [app,,,] [dev] 19220 --- [           main] com.company.app.Application    : Started Application in 20.682 seconds (JVM running for 22.166)

编辑: 根据 Marcin 的回答,我实现如下:

application.yml

logging:
  pattern:
    level: "%Xprofiles %5p"

ProfileLogger.java

public class ProfileLogger implements SpanLogger 

    private final Environment environment;
    private final Logger log;
    private final Pattern nameSkipPattern;

    @Autowired
    public ProfileLogger(String nameSkipPattern, final Environment environment) 
        this.nameSkipPattern = Pattern.compile(nameSkipPattern);
        this.environment = environment;
        this.log = org.slf4j.LoggerFactory.getLogger(this.getClass());
    

    private void setProfiles() 
        MDC.put("profiles", Arrays.toString(environment.getActiveProfiles()));
    

    @Override
    public void logStartedSpan(Span parent, Span span) 
        setProfiles();
        ...
    
    ... // (as https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanLogger.java)

LogConfig.java

@Configuration
public class LogConfig 

    private final Environment environment;

    @Autowired
    public LogConfig(final Environment environment) 
        this.environment = environment;
    

    @Bean
    SpanLogger getLogger() 
        return new ProfileLogger("", environment);
    

这会打印如下日志:

2017-03-13 14:47:02.796   INFO 22481 --- [           main] com.company.app.Application    : Started Application in 16.115 seconds (JVM running for 16.792)
2017-03-13 14:47:32.684 [localhost, swagger] TRACE 22481 --- [pool-2-thread-1] c.c.app.config.ProfileLogger    : Starting span: [Trace: bfcdd2ce866efbff, Span: bfcdd2ce866efbff, Parent: null, exportable:true]

这已经很好了,但还不是我想要的。 我想从头开始添加配置文件->即使“启动的应用程序”也应该包含配置文件-如果可能的话。其次,我想在INFO22481 之间移动profiles

在实现过程中又出现了一个问题:在链接的实现中有这样的语句:

if (this.log.isTraceEnabled()) 
    this.log.trace(text, span);

这是否意味着您仅在日志级别设置为 TRACE 时才发送跟踪信息?如果是这样,我如何使用这种方法改进对标准输出的日志记录(给定日志级别的调试/信息/警告)?我认为日志模式在导入依赖项时被 Sleuth/Zipkin 覆盖,因此,本地日志记录看起来与跟踪相同。最终,我有兴趣在本地标准输出和 Zipkin 中显示配置文件。

编辑 2: 在 Marcin 的帮助下,我通过引入包含以下行的 resources/logback-spring.xml 文件来改变模式:

<springProperty scope="context" name="activeSpringProfiles" source="spring.profiles.active"/>
<!-- Example for logging into the build folder of your project -->
<property name="LOG_FILE" value="$BUILD_FOLDER:-build/$activeSpringProfiles:-"/>​

<!-- You can override this to have a custom pattern -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%dyyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) [$activeSpringProfiles:-] %clr($PID:- )magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"/>

请注意,您还必须添加一个bootstrap.yml 文件才能正确显示应用程序名称。如果没有bootstrap.yml 文件,上面的日志模式只会打印“bootstrap”作为应用程序名称。

bootstrap.yml 只包含

spring:
  application:
    name: app

就我而言。其他一切都在 application-[profile].yml 中配置

现在一切正常:

2017-03-13 15:58:21.291  INFO [app,,,] [localhost,swagger] 27519 --- [           main] com.company.app.keyserver.Application    : Started Application in 17.565 seconds (JVM running for 18.232)

【问题讨论】:

您正在混合我所看到的所有可能的模式:P 为什么突然我们谈论在日志记录方面向 zipkin 发送跨度?它与彼此无关。如果启用了跟踪级别,那么我们将记录其他文本,例如“Continued Span”。 目前无法在那个时间点添加 Sleuth,因为实际上它没有任何意义。跟踪应该存在于业务运营中。不进行任何操作。要使日志记录模式可用,您必须将正在执行的配置添加到引导阶段。 如果你想做这样的事情,你需要完全改变日志模式。也许最好尝试像这里的logback-spring.xml 方式 - github.com/spring-cloud-samples/sleuth-documentation-apps/blob/… 。我正在那里解析应用程序名称,所以也许您可以对活动配置文件执行相同的操作并且不需要编写任何代码?如果进展顺利,您可以尝试执行此操作并 ping 回。 我很抱歉造成混乱。最终,我只想查看本地标准输出中的配置文件,以便将其记录到 Splunk :-) 为了做到这一点,我认为我必须调整 Sleuth 或 Zipkin 中的日志记录参数,因为其中一个依赖项更改了日志模式(本地)当我最初导入它时。您指出我必须实现自己的 SpanLogger 才能做到这一点(对吗?)。我只是对您的 log() 方法检查是否启用 TRACE 感到困惑,但我现在看到这仅适用于您自己的日志记录。 也许让我们将讨论转移到 Gitter 上? gitter.im/spring-cloud/spring-cloud-sleuth 另外请检查我的答案并尝试将这种方法应用于日志记录。应该有帮助。 【参考方案1】:

当然 - 您只需提供自己的日志记录格式(例如,通过 logging.pattern.level - 检查 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html 了解更多信息)。然后您必须注册自己的 SpanLogger bean 实现,您将在其中通过 MDC 添加 spring 配置文件的值(您可以以 https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanLogger.java 为例)

更新:

对于更复杂的方法,还有另一种解决方案,它似乎比重写 Sleuth 类要容易得多。您可以尝试logback-spring.xml 方式,例如这里 - https://github.com/spring-cloud-samples/sleuth-documentation-apps/blob/master/service1/src/main/resources/logback-spring.xml#L5-L11。我正在那里解析应用程序名称,所以也许您可以对活动配置文件执行相同操作而无需编写任何代码?

【讨论】:

非常感谢@marcin-grzejszczak。我试着按照你的指示更新我的问题,草稿你可能会在一些细节上提供帮助。

以上是关于将 Spring Boot Profile 添加到 Sleuth/Zipkin 日志的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot多modules的pom文件配置

如何部署同一个Spring boot web 应用到不同的环境

4spring boot 配置文件之profile

Spring Boot教程7——Profile

spring-boot结合maven配置不同环境的profile

集成maven和Spring boot的profile功能