Ответ
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).