Вопрос или проблема
У меня есть следующий код для тестирования логирования 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 отражает новую архитектуру логирования, направленную на улучшение отслеживания вызовов сервисов. Для работы с новыми именами вам нужно адаптировать свой код и использовать правильные имена для поиска событий. Не забудьте ознакомиться с релизными заметками, чтобы быть в курсе всех изменений.