log4j2 регистрация кода в EJB-банке на JBoss EAP 7

Я делаю следующее: портирую несколько устаревших приложений из WebLogic в JBoss EAP 7. Некоторые из переносимых компонентов являются EJB. Другие являются приложениями сервлетов, которые вызывают эти EJB. Эти EJB развернуты в ejb-jars. Я знаю, что могу обернуть все это в большой файл EAR, но мы не хотим этого делать. Сервлеты и EJB-файлы должны быть отдельно развертываемыми компонентами.

Тогда есть настройка регистрации. Мы используем log4j2 и хотим сохранить независимость от настройки ведения журнала JBoss. Я создал модуль JBoss, который содержит все файлы jar log4j2 с соответствующими зависимостями, и ведение журнала работает. Сервлет запускается и регистрирует, вызывает EJB и они работают.

Единственная проблема заключается в том, как настроить ведение журнала EJB. В таком веб-приложении, как сервлет, это просто, просто укажите файл конфигурации log4j в web.xml. Какой аналог для ejb jar? Я не мог придумать способ.

Я попробовал следующее: Добавьте регистратор /appender в конфигурацию приложения сервлета для пакета EJB и укажите новый файл. Не работает Новый файл журнала создается, но в файл журнала ничего не записывается. Должен быть вывод, но нет, так что, очевидно, когда EJB работает, его LogManager не использует конфигурацию, указанную в сервлете.

Как правильно указать конфигурацию log4j2 в EJB, развернутом в банке EJB на JBoss EAP7?

1 ответ

Ранее я разместил в этом месте решение, включающее использование методов @postConstruct и @preDestroy для инициализации и завершения объектов LoggerContext.

Этот план развалился, когда я попытался распространить его на сессионные компоненты без сохранения состояния. Это работало хорошо для Stateful Beans. Или я так думал. В конце концов я нашел документ Oracle об ограничениях EJB, который выявил слабые места в том, что я делал. Мое "решение" включало не окончательный статический член LoggerContext класса EJB. Я нашел способ сделать его окончательным, что позволило делу без гражданства работать. Но я все больше был недоволен своим подходом. Даже в случае с состоянием я обнаружил проблемы, которые могут укусить меня позже в кластерной среде.

Теперь я верю, что я не должен делать то, что пытался сделать.

Я не могу даже представить сложность того, что static final LoggerContext будет выглядеть, как если бы EJB был распределен на другой машине в кластере. Такие объекты, как LoggerContext, не принадлежат статическим или нет членам управляемых контейнером объектов, таких как EJB.

Даже не ясно, что EJB - это правильная технология реализации того, что я пытаюсь создать. Мои сценарии использования на самом деле не транзакционные, поэтому аргумент в пользу реализации EJB не силен, поэтому один возможный путь ведет от EJB в целом.

Реальное сообщение заключается в том, что если указаны EJB-компоненты или другие компоненты, управляемые контейнером, то, вероятно, лучше использовать предоставляемую контейнером систему ведения журнала. Мне нравится log4j2, но до тех пор, пока JBoss его не поддержит, лучше придерживаться предоставленного контейнером log4j1 или какого-то другого фреймворка.

Другие вопросы по тегам