Использование журналирования MDC с виртуальными потокамиJAVA

Программисты JAVA общаются здесь
Anonymous
Использование журналирования MDC с виртуальными потоками

Сообщение Anonymous »

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

Код: Выделить всё

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
String requestId = UUID.randomUUID().toString();
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
httpServletResponse.setHeader("requestId", requestId);
MDC.put("requestId", requestId);
chain.doFilter(request, response);
} finally {
MDC.remove("requestId");
}
}
Конфигурация журналирования.

Код: Выделить всё

%d %-5level %X{requestId} [%t] %C{10}:%L %m%n
Пример ведения журнала.

Код: Выделить всё

2024-02-04 10:29:55,160 INFO  99cd4d64-5d7c-4577-a5d3-cb8d48d1dfd5 [http-nio-8080-exec-6] c.s.q.UserController:65 Deleteing user 'test'
2024-02-04 10:29:55,260 INFO  99cd4d64-5d7c-4577-a5d3-cb8d48d1dfd5 [http-nio-8080-exec-6] c.s.q.UserController:70 Successfully deleted user 'test'
С виртуальными потоками в Java 21+ у меня сложилось впечатление, что поток может автоматически приостановить запрос, пока он ожидает любого ввода-вывода, и поток может начать работать над другими запросами. В этом сценарии кажется, что MDC журнала может «просачиваться» в другие журналы запросов, когда поток начинает обслуживать другие запросы. Как мне обойти эту проблему, чтобы продолжать добавлять уникальное значение к операторам регистрации каждого запроса?

Подробнее здесь: https://stackoverflow.com/questions/779 ... al-threads

Вернуться в «JAVA»