Log4j для компонентов, управляемых сообщениями

Итак, вот моя проблема:
У меня есть bean-компонент X, управляемый сообщениями, и я хотел бы использовать Logger в методе X onMessage(). Предположим, что у меня есть один экземпляр bean-компонента, работающего на моем сервере приложений, поэтому я бы инициализировал log4j в ejbCreate(). Это означало бы, что я должен был бы сделать что-то вроде этого:

public void ejbCreate() {
    PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties"));
}

Однако это не помогает. Что бы я ни делал, я всегда получаю свой поток как нулевой, я пробовал другие версии: this.getClass().getStream() и ResourceBundle.

Я записал свой файл свойств в test.jar и добавил его в библиотеки EAR (я использую RAD7), и это отразилось в моем manifest.mf.

Кто-нибудь сталкивался с этой проблемой раньше? Если да, то как вы ее решили? Ценю твою помощь...


person Jay    schedule 10.06.2009    source источник


Ответы (3)


Я бы не рекомендовал настраивать log4j в методе создания EJB. Несколько EJBeans могут быть активированы/пассивированы по желанию контейнера в соответствии со спецификацией J2EE. Таким образом, есть вероятность, что вы в конечном итоге настроите log4j несколько раз. Рекомендуется использовать запускаемые bean-компоненты, которые гарантированно будут вызываться только 1 раз.

person zkarthik    schedule 11.06.2009
comment
Что такое стартап-бин? и как вы гарантируете, что он вызывается только один раз? - person Jay; 11.06.2009
comment
Компонент запуска приложения — это компонент сеанса, который загружается при запуске приложения. Компоненты запуска приложений позволяют приложениям J2EE автоматически запускать бизнес-логику всякий раз, когда приложение нормально запускается или останавливается, хотя и только один раз. - person zkarthik; 21.06.2009

Если вы получаете это из файла JAR, вам не хватает начального /:

Classloader.getResourceAsStream("/xyz_log4j.properties")

И в зависимости от того, какой каталог содержит файл свойств, вы должны указать путь к этому каталогу относительно вершины иерархии классов. Например, если этот файл свойств находится в том же каталоге, что и net.mine.Program, вы должны сделать следующее:

Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties")

Я не верю, что вы можете читать из каталога META-INF, используя getResourceAsStream(), но я никогда не пробовал, так что, возможно, есть способ сделать это.

person Eddie    schedule 10.06.2009

Вы можете попробовать жестко закодировать имя класса в файле load.

<name of your class>.class.getResourceAsStream(fileName);

В качестве альтернативы вы можете изучить SLF4J. Это фасад, который может располагаться поверх LOG4J. API в основном тот же (я думаю, тот же создатель), и SLF4J не требует явного вызова инициализации, что немного упрощает ситуацию.

person James McMahon    schedule 10.06.2009
comment
Только если файл свойств находится в том же каталоге, что и класс. - person Eddie; 10.06.2009
comment
Я думаю, что вы правы, но, возможно, есть способ настроить путь. - person James McMahon; 10.06.2009