Когда я обновляю CXF с версии 3.x до 4.x, почему LogEvents используют другое имя?

Вопрос или проблема

У меня есть следующий код для тестирования логирования CXF

import org.apache.cxf.interceptor.LoggingOutInterceptor;
    List<LogEvent> logEvents = LogEventManager.INSTANCE.getEvents(LoggingOutInterceptor.class.getName());
    assertEquals(4, logEvents.size());

Я заметил, что это сломалось, когда я перешел на 4.x, как

Expected: an instance of ...RestServiceException
     but: <java.lang.AssertionError: expected:<4> but was:<0>> is a java.lang.AssertionError
Stacktrace was: java.lang.AssertionError: expected:<4> but was:<0>
    at org.junit.Assert.fail(Assert.java:89)

Когда я отлаживаю оба случая, я замечаю, что LogEvent 3.x имеет имя org.apache.cxf.interceptor.LoggingOutInterceptor, но 4.x имеет значение org.apache.cxf.services.GreetingApi.REQ_OUT

Почему это изменилось, и может ли кто-нибудь указать мне на примечания к релизу, которые это показывают?

Также дополнительные баллы, если вы можете рассказать, как получить REQ_OUT, когда я рефакторю, как

List<LogEvent> logEvents = LogEventManager.INSTANCE.getEvents(GreetingApi.class.getName());

Ответ или решение

Когда вы обновляете CXF с версии 3.x до 4.x, вы могли заметить, что имена событий логирования (LogEvents) изменились. В версии 3.x вы наблюдали имя org.apache.cxf.interceptor.LoggingOutInterceptor, в то время как в версии 4.x одно из имен мероприятий стало org.apache.cxf.services.GreetingApi.REQ_OUT. Это изменение произошло в результате новой архитектуры и настраиваемости системы логирования в CXF.

Почему произошло это изменение?

Основная причина состоит в том, что в CXF 4.x была обновлена логическая структура логирования. Теперь система логирования более ориентирована на сервисы и операции, а не на конкретные интерсепторы. Это позволяет более точно отслеживать события, относящиеся к конкретным аспектам вызовов ваших сервисов.

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

Поиск информации в релизных заметках

Для того чтобы найти официальные релизные заметки, детализирующие изменения, вы можете ознакомиться с сайте Apache CXF, а именно с разделом изменений (Changelog) для версии 4.x. В нем обычно содержится информация о внесенных изменениях, улучшениях и изменениях API, которые могут затронуть ваш код.

Как работать с новым именем события

Чтобы получить события логирования для вашего GreetingApi класса, вам следует изменить свой код для указания имени класса или операции, как вы уже хотите сделать:

List<LogEvent> logEvents = LogEventManager.INSTANCE.getEvents("org.apache.cxf.services.GreetingApi.REQ_OUT");

Или, если вы хотите получить все события для вашего класса GreetingApi, вам нужно использовать подход, который позволит вам фильтровать события по названию операции. Вы можете использовать метод getEvents в сочетании с образцом имени, чтобы получить все события, относящиеся к GreetingApi. Например:

List<LogEvent> logEvents = LogEventManager.INSTANCE.getEvents(GreetingApi.class.getName() + ".*");

Это должно вернуть все соответствующие события, включая REQ_OUT, которые вы искали.

Итог

В заключение, изменение имен событий в CXF 4.x отражает новую архитектуру логирования, направленную на улучшение отслеживания вызовов сервисов. Для работы с новыми именами вам нужно адаптировать свой код и использовать правильные имена для поиска событий. Не забудьте ознакомиться с релизными заметками, чтобы быть в курсе всех изменений.

Оцените материал
Добавить комментарий

Капча загружается...