Добавить профиль загрузки Spring в журналы Sleuth / Zipkin

Я использую эти зависимости:

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)

РЕДАКТИРОВАТЬ: Основываясь на ответе Марцина, я реализовал его следующим образом:

application.yml

logging:
  pattern:
    level: "%X{profiles} %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]

Это уже хорошо, но еще не совсем то, что я ищу. Я хотел бы добавить профиль с самого начала -> даже «Запущенное приложение» должно содержать профиль - если возможно. Во-вторых, я бы хотел переместить profiles между INFO и 22481.

Еще один вопрос возник во время реализации: в связанной реализации есть это утверждение:

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

Означает ли это, что вы отправляете трассировки только в том случае, если для уровня журнала задано значение TRACE? Если да, то как я могу улучшить ведение журнала в стандартный вывод с помощью этого подхода (учитывая уровень журнала debug / info / warn)? Я думаю, что шаблон журнала переопределяется 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(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) [${activeSpringProfiles:-}] %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

Обратите внимание, что вам также необходимо добавить файл bootstrap.yml, чтобы имя приложения отображалось правильно. Без файла bootstrap.yml приведенный выше шаблон журнала просто печатает "bootstrap" как имя приложения.

bootstrap.yml просто содержит

spring:
  application:
    name: app

в моем случае. Все остальное настраивается в приложении- [профиль] .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)

person user3105453    schedule 13.03.2017    source источник
comment
Вы смешиваете все возможные шаблоны из того, что я вижу: P Почему вдруг мы говорим об отправке интервалов в zipkin с точки зрения ведения журнала? Это не имеет ничего общего друг с другом. Если уровень трассировки включен, мы регистрируем дополнительный текст, например Continued Span.   -  person Marcin Grzejszczak    schedule 13.03.2017
comment
На данный момент невозможно добавить Сыщика в этот момент времени, потому что на самом деле это не имеет смысла. Отслеживание должно присутствовать в деловых операциях. Ни в одной операции. Чтобы сделать шаблон регистрации доступным, вам нужно будет добавить конфигурацию, которую вы делаете, на этапе начальной загрузки.   -  person Marcin Grzejszczak    schedule 13.03.2017
comment
Вам нужно будет полностью изменить шаблон ведения журнала, если вы хотите сделать что-то подобное. Может быть, тогда лучше попробовать logback-spring.xml способ, как здесь - github.com/spring-cloud-samples/sleuth-documentation-apps/blob/. Я разрешаю имя приложения там, поэтому, может быть, вы могли бы сделать то же самое с активными профилями, и вам не нужно было писать какой-либо код? Вы можете попробовать сделать это и ответить, если все прошло хорошо.   -  person Marcin Grzejszczak    schedule 13.03.2017
comment
Приношу свои извинения за путаницу. В конце концов я просто хочу увидеть профили в моем локальном stdout, чтобы он регистрировался в Splunk :-) Для этого я подумал, что мне нужно настроить параметры ведения журнала в Sleuth или Zipkin, потому что одна из зависимостей изменила шаблон журнала (локально) когда я изначально импортировал это. Вы указали, что мне нужно реализовать свой собственный SpanLogger, чтобы сделать это (верно?). Меня просто смутил тот факт, что ваш метод log () проверяет, включена ли TRACE или нет, но теперь я вижу, что это только для вашей собственной регистрации.   -  person user3105453    schedule 13.03.2017
comment
Может, перенесем обсуждение в Гиттер? gitter.im/spring-cloud/spring-cloud-sleuth Также проверьте мои ответы и попробуйте применить этот подход к ведению журнала. Должно помочь.   -  person Marcin Grzejszczak    schedule 13.03.2017
comment
Я попробую ваш logback-spring.xml подход и снова отправлю пинг с результатом. Большое тебе спасибо.   -  person user3105453    schedule 13.03.2017
comment
Ваш подход к выходу сработал, спасибо. Я добавил свои выводы к вопросу, может быть, вы хотите добавить ответ, чтобы получить кредиты :) ура   -  person user3105453    schedule 13.03.2017
comment
Я обновил ответ подходом logback-spring.xml :)   -  person Marcin Grzejszczak    schedule 13.03.2017


Ответы (1)


Конечно - вам нужно просто указать свой собственный формат ведения журнала (например, через logging.pattern.level - отметьте https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html для получения дополнительной информации). Затем вам нужно зарегистрировать свою собственную реализацию SpanLogger bean-компонента, в которой вы позаботитесь о добавлении значения профиля Spring через MDC (вы можете взглянуть на это в качестве примера 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. Я разрешаю имя приложения там, поэтому, может быть, вы могли бы сделать то же самое с активными профилями, и вам не нужно было писать какой-либо код?

person Marcin Grzejszczak    schedule 13.03.2017
comment
Большое спасибо @ marcin-grzejszczak. Я попытался следовать вашим инструкциям и добавил в свой вопрос черновик, который вы могли бы помочь в некоторых деталях. - person user3105453; 13.03.2017