[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-logirovanie-chto-takoe-mdc-mapped-diagnostic-context":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1301,"chto-takoe-mdc-mapped-diagnostic-context",43,"logirovanie","Логирование","📝","Что такое MDC (Mapped Diagnostic Context)?","MDC (Mapped Diagnostic Context) — механизм SLF4J\u002FLogback для привязки контекстных данных к текущему потоку. Все лог-записи в рамках потока автоматически обогащаются данными из MDC.\n\n> **Аналогия из жизни:** MDC — это как бейдж посетителя в бизнес-центре. Пока бейдж надет, каждая камера на каждом этаже автоматически идентифицирует человека. Не нужно представляться у каждой двери.\n\n### Основное применение — correlation ID\n\nВсе лог-записи одного HTTP-запроса связываются единым идентификатором:\n\n\u003Cdetails>\n\u003Csummary>Фильтр для установки requestId в MDC\u003C\u002Fsummary>\n\n```java\n@Component\npublic class RequestFilter implements Filter {\n\n    @Override\n    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)\n            throws IOException, ServletException {\n        String requestId = ((HttpServletRequest) req).getHeader(\"X-Request-ID\");\n        if (requestId == null) {\n            requestId = UUID.randomUUID().toString();\n        }\n        MDC.put(\"requestId\", requestId);\n        try {\n            chain.doFilter(req, resp);\n        } finally {\n            MDC.clear(); \u002F\u002F ОБЯЗАТЕЛЬНО очистить!\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Конфигурация Logback для вывода MDC\n\n```xml\n\u003Cpattern>%d{ISO8601} [%thread] [%X{requestId}] %-5level %logger{36} - %msg%n\u003C\u002Fpattern>\n\u003C!-- %X{requestId} — подставляет значение из MDC -->\n```\n\n### Результат в логах\n\n```\n2026-04-22 10:15:32.456 [http-nio-8080-exec-1] [a1b2c3d4] INFO  OrderService - Создание заказа\n2026-04-22 10:15:32.789 [http-nio-8080-exec-1] [a1b2c3d4] INFO  PaymentService - Оплата обработана\n2026-04-22 10:15:33.012 [http-nio-8080-exec-1] [a1b2c3d4] INFO  NotificationService - Уведомление отправлено\n```\n\nВсе три записи связаны одним `requestId` — можно отследить весь путь запроса через систему.\n\n### Как работает MDC внутри\n\nMDC основан на `ThreadLocal` — каждый поток хранит свою копию контекстных данных. Это означает:\n\n| Сценарий | Поведение MDC | Решение |\n|----------|--------------|---------|\n| Синхронный код | Работает автоматически | - |\n| `@Async` методы | Новый поток не наследует MDC | `TaskDecorator` для копирования |\n| Reactive (WebFlux) | `ThreadLocal` не работает | `Reactor Context` |\n| Virtual Threads | Работает, но при миллионах потоков расходует память | Рассмотрите `ScopedValue` |\n\n### Частые ошибки\n\n- Забыть `MDC.clear()` в `finally` — утечка контекста между запросами в пуле потоков (thread reuse)\n- MDC в `@Async` методах — новый поток не наследует MDC; нужен TaskDecorator для копирования\n- MDC с Virtual Threads — при миллионах потоков MDC (на основе ThreadLocal) потребляет значительную память\n\n### Как используется в 2026\n\n- MDC + correlation ID — стандартный паттерн для tracing в микросервисах\n- Micrometer Tracing (Spring Boot 3.x) автоматически пробрасывает traceId\u002FspanId в MDC\n- В реактивном стеке (WebFlux) вместо MDC используется Reactor Context\n\n> **На собеседовании:** главное — объяснить связку MDC + ThreadLocal + обязательная очистка. Частая ошибка кандидатов — не упомянуть проблему с асинхронным кодом, где MDC не передаётся автоматически.","","middle",[15],"logging",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое MDC (Mapped Diagnostic Context)? — Gymterview","MDC (Mapped Diagnostic Context) — механизм SLF4J\u002FLogback для привязки контекстных данных к текущему потоку. Все лог-записи в рамках потока автоматически обогаща","MDC (Mapped Diagnostic Context) — механизм SLF4J\u002FLogback для привязки контекстных данных к текущему потоку. Все лог-запи",[15,13],"MDC (Mapped Diagnostic Context) — механизм SLF4J\u002FLogback для привязки контекстных данных к текущему потоку. Все лог-записи в рамках потока автоматически обогащаются данными из MDC.",true]