MDC регистрирует неправильный идентификатор сеанса в файлах журналов

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

Я использую sessionId в фильтре

MDC.put("sessionId", request.getSession().getId());

Вывод журнала

2015-01-24 23:13:04,857 INFO [STDOUT] (http-0.0.0.0-8090-28) [LOGBACK] 23:13:04.857 [INFO ] 371691C0B3B4481E9589BDE0C24F54C8 [Inbound Message][ID:319526][Address:http://195.233.91.82:8090/myacct/activate/updateConsent][Http-Method:POST][Content-Type:application/json; charset=UTF-8][Headers:{cookie=[JSESSIONID=371691C0B3B4481E9589BDE0C24F54C8;.....
2015-01-24 23:13:05,242 INFO [STDOUT] (http-0.0.0.0-8090-28) [LOGBACK] 23:13:05.242 [INFO ] 1434BC692D5059660EA0F8B36B143064 [Outbound Message][ID:319526][Response-Code:200][Content-Type:application/json;charset=utf-8].......

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

В соответствии с MDC «MDC управляется для каждого потока»

Я что-то не так делаю?


person NullPointerException    schedule 26.01.2015    source источник
comment
Вы уверены, что request.getSession() вообще возвращает другой сеанс? Кажется, это не так. Возможно, попробуйте зарегистрировать request.getSession() вместе с идентификатором потока, чтобы подтвердить, действительно ли проблема с MDC или в вашем приложении есть проблема с потоками.   -  person James Murphy    schedule 27.01.2015
comment
Тема такая же, как вы можете видеть в журнале http-0.0.0.0-8090-28   -  person NullPointerException    schedule 27.01.2015
comment
какой ответ в итоге?   -  person Andrei Epure is hiring    schedule 10.05.2017


Ответы (1)


Цитата из источника:

https://blog.trifork.com/2013/06/06/добавление-информации-пользователя-к-записи-журнала-в-многопользовательском-приложении-использовании-сопоставления-диагностического-контекста/

Последствия использования MDC на основе ThreadLocal

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

Распространение содержимого MDC в другие потоки происходит автоматически для дочерних потоков (ОБНОВЛЕНИЕ: это больше не верно для Logback, начиная с версии 1.1.5), но не тогда, когда вы используете потоки, полученные, например, из пул потоков. Это означает, что вы теряете информацию MDC при выполнении какой-либо асинхронной задачи.

Если вы хотите, чтобы содержимое MDC было доступно из рабочих потоков, перед выполнением задач убедитесь, что вы распространяете содержимое MDC в эти потоки. MDC SLF4J имеет метод getCopyOfContextMap() для этой конкретной цели. Одним из возможных подходов для этого является использование выделенного подкласса Runnable:

person guest00001    schedule 07.08.2018