SLF4J MDC: утечка данных из дочернего потока в родительский

У меня есть приложение Spring MVC, в котором настроено ведение журнала с использованием SLF4J. Я использую два разных аспекта (используя spring-aop) для ведения журнала: один для регистрации всех входящих HTTP-запросов, а другой для регистрации асинхронных задач. Асинхронные задачи запускаются с помощью ExecutorService.

Насколько я понимаю, при использовании ExecutorService MDC порожденного потока не наследует уже установленные значения. Но похоже, что это так. Справедливо. Я просто вызываю org.slf4j.MDC.clear () в моем дочернем потоке, чтобы сбросить значения.

Моя проблема в том, что значения, которые я устанавливаю в порожденном дочернем потоке, также отображаются в исходном родительском потоке MDC.

Это нормально, или я что-то не так делаю? Есть ли способ предотвратить это?


person Robert Bowen    schedule 03.04.2018    source источник
comment
Не могли бы вы поделиться кодом, в идеале MCVE? Это StackOverflow. Спасибо. Другой вопрос: какую структуру ведения журнала вы используете под SLF4J. Логбэк или Log4J? Кстати, я исправил вашу опечатку, вы написали sl4j в теме и в основном тексте. Теперь, возможно, специалистам по SLF4J будет проще найти ваш вопрос.   -  person kriegaex    schedule 04.04.2018


Ответы (1)


Извините, что не опубликовал код. Я думал, что мой вопрос был скорее общим: «Это должно происходить?» вроде вопрос. Но очевидно, что код всегда помогает.

Fyi, я использую Log4j под SL4J.

Во всяком случае, я нашел свою проблему. На самом деле это не имеет ничего общего с MDC, а все связано с тем фактом, что в тестовом режиме мы переопределяем метод execute () ThreadPoolTaskExecutor, так что на самом деле он не < / strong> начать новую тему. Не имел представления. По-видимому, это делается потому, что в противном случае тесты имеют транзакционные проблемы. Это объясняет, почему у меня проблемы с утечкой данных.

Так что это моя проблема, а не MDC. Я подтвердил, что резервное копирование MDC HashTable является одним и тем же экземпляром как для HTTP-запросов, так и для асинхронных задач. Похоже, я застрял в этом. :(

В любом случае, спасибо за ответ.

person Robert Bowen    schedule 04.04.2018