Связь логов через correlation id в многопоточных\многопользовательских системах.
В многопоточных\многопользовательских системах часто возникает задача ввести атрибут по которому можно будет находить логически связанные между собой записи логов. Например: записи относящиеся к сессии конкретного пользователя.
В Log4j для этой задачи есть класс MDC https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
На старте обработки можно сохранить уникальный идентификатор. В качестве уникального идентификатора можно взять значение либо прикладного поля либо сгенерировать суррогатное UUID.randomUUID().toString()
MDC.put(CORRELATION_ID_LOG_VAR_NAME, correlationId);
CORRELATION_ID_LOG_VAR_NAME можно определить как
private static final String CORRELATION_ID_LOG_VAR_NAME = "correlationId";
Если по мере исполнения потребуется его извлечь, то можно вызвать Object correlationId = MDC.get(CORRELATION_ID_LOG_VAR_NAME);
В конце нужно обязательно почистить за собой
MDC.remove(CORRELATION_ID_LOG_VAR_NAME);
Для вывода в лог нужно добавить в log4j.xml значение %X{correlationId}
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] %X{correlationId} - <%m>%n"/>
</layout>
</appender>
Post #44
1.17K