Log4j для компонентов, управляемых сообщениями
-
13-09-2019 - |
Вопрос
Итак, вот моя проблема:
У меня есть bean-компонент X, управляемый сообщениями, и я хотел бы использовать Logger в методе X onMessage().Предположим, что у меня есть единственный экземпляр bean-компонента, работающий на моем сервере приложений, поэтому я бы инициализировал log4j в ejbCreate().Это означало бы, что мне придется сделать что-то вроде этого:
public void ejbCreate() {
PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties"));
}
Однако это не помогает.Что бы я ни делал, мой поток всегда имеет значение null, я пробовал другие версии:this.getClass().getStream() и ResourceBundle.
Я поместил свой файл свойств в test.jar и добавил его в библиотеки EAR (я использую RAD7), и это отразилось в моем манифесте.mf.
Кто-нибудь сталкивался с этой проблемой раньше?Если да, то как вы это решили?Ценю вашу помощь...
Решение
Я бы не рекомендовал настраивать log4j в методе создания EJB.Несколько EJBeans могут быть активированы/пассивированы по желанию контейнеров в соответствии со спецификацией J2EE.Таким образом, есть вероятность, что вам придется настроить log4j несколько раз.Рекомендуется использовать bean-компоненты запуска, которые гарантированно будут вызываться только 1 раз.
Другие советы
Если вы получаете это из файла JAR, значит, вам не хватает начального файла. /
:
Classloader.getResourceAsStream("/xyz_log4j.properties")
И в зависимости от того, в каком каталоге находится файл свойств, вам необходимо указать путь к этому каталогу относительно вершины иерархии классов.Например, если этот файл свойств находится в том же каталоге, что и net.mine.Program
, то вы бы сделали это:
Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties")
Я не верю, что вы можете читать из каталога META-INF, используя getResourceAsStream()
, но я никогда не пробовал, так что, возможно, есть способ сделать это.
Вы можете попробовать жестко закодировать имя класса в загрузке.
<name of your class>.class.getResourceAsStream(fileName);
В качестве альтернативы вы можете изучить SLF4J.Это фасад, который может располагаться поверх LOG4J.API в основном тот же (я полагаю, тот же создатель), и SLF4J не требует явного вызова инициализации, что немного упрощает ситуацию.