Logback sfl4j MDC уникален для http-запроса

Я работаю со Sping Boot 1.5.7. Приложение предлагает API Restful. У меня есть фильтр, в котором я устанавливаю MDC с именем пользователя и идентификатором транзакции.

    MDC.put("user", authentication.getPrincipal().toString());
    MDC.put("trans-id",authentication.getTokenId());

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

Не могли бы вы мне помочь? Спасибо.

ОБНОВИТЬ:

В журнале ниже каждой строки находится http-запрос:

2017-11-10 21:34:52.867 | user=USER, trans-id=c28f4b68-b5f3-4b5c-9bb5-f18ba9d1cd7d, session-id=daaddaadda |   INFO 976 - [tp1005246661-89] i.e.h.controller.IsAliveController       : /isAlive WSC | 

2017-11-10 21:34:59.551 | user=USER, trans-id=4a0eaec1-184a-4587-8fce-ab013ad6539b, session-id=daaddaadda |   INFO 976 - [tp1005246661-89] i.e.h.controller.IsAliveController       : /isAlive public | 

Во втором запросе я устанавливаю только trans-id, вместо этого в карте MDC есть session-id и user, установленные в первом запросе.


person Michel Foucault    schedule 10.11.2017    source источник


Ответы (2)


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

The MDC manages contextual information on a per thread basis. Typically, while starting to service a new client request, the developer will insert pertinent contextual information, such as the client id, client's IP address, request parameters etc. into the MDC
person sayboras    schedule 10.11.2017
comment
Я обновил свой пост с дополнительной информацией. Спасибо. - person Michel Foucault; 10.11.2017
comment
Понимать. Вы можете очистить значения MDC в перехватчике spring. Переопределения HandlerInterceptorAdapter#preHandle может быть достаточно - person sayboras; 11.11.2017
comment
У вас есть пример, пожалуйста? - person Michel Foucault; 11.11.2017
comment
Конечно, я просто быстро проверить это. Кажется, работает нормально - person sayboras; 11.11.2017
comment
Ok. Я попробую. Теперь я очистил карту MDC перед первой инициализацией. Кажется, работает нормально. Спасибо - person Michel Foucault; 11.11.2017
comment
код кажется слишком длинным для комментариев, поэтому пишите только как ответ. - person sayboras; 11.11.2017

Вот пример класса конфигурации

@Configuration
public class SpringConfig extends WebMvcConfigurerAdapter {
    private static final Logger LOG = LoggerFactory.getLogger(SpringConfig.class);

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new HandlerInterceptor() {
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            LOG.info("Inside pre-handle");
            MDC.clear();
            return true;
        }

        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        }

        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception 
{

        }
    });
}
}
person sayboras    schedule 11.11.2017
comment
Спасибо. перехватчик запускается перед фильтром? - person Michel Foucault; 11.11.2017
comment
именно, для каждого входящего запроса, MDC будет очищаться первым и приходить к фактическому обработчику запроса - person sayboras; 11.11.2017
comment
Я попробую. Спасибо - person Michel Foucault; 11.11.2017
comment
@Apolozeus, возможно, вы должны отредактировать свой другой ответ (щелкнув ссылку edit под ответом), а не публиковать второй ответ на тот же вопрос? - person glytching; 11.11.2017
comment
@Apolozeus, в моем случае я вставил MDC.clear() в FIlter. Фильтр выполняется перед Interceptor. Спасибо. - person Michel Foucault; 13.11.2017
comment
@Michel Foucault О, приятно знать, спасибо за информацию. Это может быть полезно для меня в будущем. - person sayboras; 13.11.2017