Что такое MDC (Mapped Diagnostic Context) в контексте логирования?

«Что такое MDC (Mapped Diagnostic Context) в контексте логирования?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MDC (Mapped Diagnostic Context) — это механизм логгеров (SLF4J, Logback, Log4j 2), который позволяет прикреплять контекстную информацию к потоку выполнения (ThreadLocal) для её автоматического добавления в каждую запись лога. Это критически важно для трейсинга запросов в распределённых системах.

Типичное использование — добавление ID запроса:

import org.slf4j.MDC;

// В начале обработки запроса (например, в фильтре Servlet)
MDC.put("requestId", UUID.randomUUID().toString());
MDC.put("userId", currentUserId);

try {
    logger.info("Начало обработки запроса"); // В лог попадёт: [requestId:abc-123, userId:45] Начало обработки...
    // ... бизнес-логика
} finally {
    // ОБЯЗАТЕЛЬНАЯ очистка после завершения, особенно при использовании пулов потоков!
    MDC.clear();
}

Конфигурация шаблона в logback.xml:

<pattern>%d{HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{36} - %msg%n</pattern>

Ключевые моменты:

  • Основан на ThreadLocal, поэтому контекст уникален для каждого потока.
  • Обязательная очистка (MDC.clear()) в finally-блоке, иначе контекст «перетечёт» к следующей задаче в пуле потоков.
  • Позволяет легко фильтровать и агрегировать логи по конкретному запросу (requestId) или пользователю (userId).