Log4j для бобов, управляемых сообщениями - PullRequest
1 голос
/ 10 июня 2009

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

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

Classloader.getResourceAsStream("/xyz_log4j.properties")

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

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

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

1 голос
/ 11 июня 2009

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

1 голос
/ 10 июня 2009

Вы можете попробовать жестко запрограммировать имя класса в загрузке.

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

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

...