← Назад ко всем вопросам

Что такое MDC

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Зачем нужен MDC?

В многопоточных приложениях, таких как веб-серверы, часто возникает необходимость отслеживать выполнение отдельных запросов. Например, если у вас есть веб-приложение, обрабатывающее множество запросов одновременно, и вы хотите отследить, какие логи относятся к какому запросу, MDC позволяет добавлять уникальные идентификаторы или другую контекстную информацию к каждому логу, связанному с конкретным запросом.

Как работает MDC?

MDC использует ThreadLocal переменные для хранения контекстной информации, что позволяет каждому потоку иметь свой собственный набор данных. Это значит, что данные, добавленные в MDC в одном потоке, не будут видны в другом потоке.

Пример использования MDC

Рассмотрим пример, где мы используем MDC для добавления уникального идентификатора запроса к логам:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
​
public class WebRequestHandler {
​
    private static final Logger logger = LoggerFactory.getLogger(WebRequestHandler.class);
​
    public void handleRequest(String requestId) {
        // Добавляем уникальный идентификатор запроса в MDC
        MDC.put("requestId", requestId);
​
        try {
            // Логируем начало обработки запроса
            logger.info("Start processing request");
​
            // Выполняем основную логику обработки запроса
            processRequest();
​
            // Логируем успешное завершение обработки запроса
            logger.info("Request processed successfully");
        } finally {
            // Удаляем идентификатор запроса из MDC, чтобы избежать утечек памяти
            MDC.remove("requestId");
        }
    }
​
    private void processRequest() {
        // Здесь выполняется основная логика обработки запроса
        // Например, взаимодействие с базой данных или другими сервисами
    }
}

Объяснение кода:

  • MDC.put("requestId", requestId);: Добавляет уникальный идентификатор запроса в MDC. Этот идентификатор будет доступен в логах, связанных с текущим потоком.
  • logger.info("Start processing request");: Логирует начало обработки запроса. Благодаря MDC, в логах будет отображаться идентификатор запроса.
  • processRequest();: Выполняет основную логику обработки запроса.
  • logger.info("Request processed successfully");: Логирует успешное завершение обработки запроса.
  • MDC.remove("requestId");: Удаляет идентификатор запроса из MDC после завершения обработки, чтобы избежать утечек памяти.

Где применяется MDC?

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

Тема: Логи/Профилирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки