Карта / Логирование / MDC, correlation id

MDC, correlation id

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

Correlation ID (он же request ID, trace ID) — уникальный идентификатор, присвоенный одному запросу, который добавляется в каждую строку лога, написанную во время обработки этого запроса.

MDC (Mapped Diagnostic Context) — механизм SLF4J, который хранит такие “контекстные” данные (correlation id, id пользователя) и автоматически подставляет их в каждый лог без необходимости передавать вручную в каждый вызов:

MDC.put("correlationId", UUID.randomUUID().toString());   // один раз в начале обработки запроса
log.info("Начали обработку заказа");    // в строку лога автоматически попадёт correlationId
log.info("Заказ сохранён");              // и сюда тоже, без повторной передачи
MDC.clear();                               // обязательно очистить после обработки
Копнуть глубже

Без correlation id отладка прода превращается в гадание. Если пользователь жалуется на ошибку, а в логах тысячи перемешанных строк от параллельных запросов — невозможно понять, какие именно строки относятся к его проблеме. С correlation id — просто фильтруешь логи по одному ID и видишь полную картину одного запроса от начала до конца.

В микросервисной архитектуре это особенно критично. Один запрос пользователя может пройти через несколько сервисов (Gateway → Auth → Order → Payment) — если каждый сервис передаёт один и тот же correlation id дальше (обычно через HTTP-заголовок), можно проследить весь путь запроса по всей системе, даже не имея доступа к коду каждого сервиса.

В Spring обычно настраивают через фильтр (Filter), который генерирует ID на входе запроса (или берёт из заголовка, если он уже пришёл от предыдущего сервиса), кладёт в MDC, и удаляет в finally после завершения обработки — MDC хранится в ThreadLocal, поэтому критично не забыть про clear(), иначе данные “утекут” в следующий запрос, обработанный тем же потоком.

🎤 Закрыл тему, если можешь объяснить:
• зачем нужен correlation id и какую проблему он решает;
• как MDC автоматически подставляет данные в каждую строку лога и почему важен `MDC.clear()` (если дошёл до 2-го слоя).