2009-06-10 1 views
1

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

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

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

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

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

ответ

1

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

+0

Что такое фасоль запуска? и как вы гарантируете, что он вызывается только один раз? – Jay

+0

n application startup bean - это компонент сеанса, который загружается при запуске приложения. Базы запуска приложений позволяют приложениям J2EE автоматически запускать бизнес-логику, когда приложение запускается или останавливается нормально, хотя и одно время. – zkarthik

2

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

Classloader.getResourceAsStream("/xyz_log4j.properties") 

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

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

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

1

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

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

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

+0

Только если файл свойств находится в том же каталоге, что и класс. – Eddie

+0

Я думаю, что вы правы, но, возможно, есть способ настроить путь. –

Смежные вопросы