%thread и повторяющиеся имена потоков

Я столкнулся с проблемами со сторонними библиотеками и потоками, использующими то же имя. Есть ли способ показать хэш или уникальный идентификатор для потока?

В итоге я создал свой собственный конвертер, чтобы справиться с этим, я не был уверен, что что-то упустил.

Вот что у меня есть

import org.springframework.stereotype.Component;

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

/**
 * Creates a hash string for the current thread
 */
@Component
public class ThreadHashHexString extends ClassicConverter {
  @Override
  public String convert(ILoggingEvent event) {
    return Integer.toHexString(System.identityHashCode(Thread.currentThread()));

  }
}

person ryanthedev    schedule 16.03.2020    source источник


Ответы (1)


К сожалению, logback фиксирует только имя потока в его LoggingEvent. т. е. logback не фиксирует идентификатор потока или любую другую информацию о потоке, который зарегистрировал событие.

Проблема с предлагаемым вами решением заключается в том, что оно предполагает, что текущий поток является потоком, в котором был сгенерирован LoggingEvent, что не всегда будет иметь место. Например, если используется асинхронный присоединитель, текущим потоком, в котором вызывается преобразователь, будет поток, кодирующий событие, а не поток, зарегистрировавший событие.

Если вы не используете асинхронный присоединитель, вы можете использовать Thread.currentThread() в преобразователе, как вы это сделали. Или (поскольку вы отметили вопрос с помощью logstash-logback-encoder), вы можете реализовать свой собственный JsonProvider для регистрации идентификатора потока/identityHashCode в виде поля JSON.

person Phil Clay    schedule 24.04.2020
comment
Отличный момент! Но если мы регистрируемся только на стандартный вывод, у нас все должно быть хорошо, верно? - person ryanthedev; 25.04.2020
comment
Пока консольный модуль не находится за асинхронным приложением, все должно быть в порядке. - person Phil Clay; 25.04.2020