2009-06-10 72 views
1

所以,這裏是我的問題:
我有一個消息驅動的bean X,並希望在X的onMessage()方法中使用Logger。讓我們假設我有一個在我的應用服務器上運行的bean實例,因此,我會在ejbCreate()中初始化log4j。這意味着我將不得不這樣做:Log4j消息驅動豆

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

但是,這沒有幫助。無論我做什麼,我總是將我的流作爲null,我嘗試了其他版本:this.getClass()。getStream()和ResourceBundle。

我將我的屬性文件放入test.jar中,並將其添加到EAR庫下(我正在使用RAD7),並將其反映在我的manifest.mf中。

以前有人遇到過這個問題嗎?如果是的話,你是如何解決它的? 感謝您的幫助......

回答

1

我不推薦在EJB創建方法中配置log4j。每個J2EE規範的容器可以激活/激活多個EJBean。所以你可能會多次配置log4j。建議使用啓動bean,這些啓動bean只能保證只調用一次。

2

如果你從一個JAR文件中得到這個,那麼你就錯過了iniitial /

Classloader.getResourceAsStream("/xyz_log4j.properties") 

,並根據哪個目錄包含了屬性文件,你必須指定相對於類層次結構頂部的那個目錄的路徑。例如,如果這個屬性文件是在同一目錄net.mine.Program,那麼你可以這樣做:

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

我不相信你可以使用getResourceAsStream()的META-INF目錄中讀取,但我從來沒有試過或許有辦法做到這一點。

1

您可以嘗試將類名加載到負載中。

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

或者,您可能需要查看SLF4J。這是一個可以坐在LOG4J頂部的門面。 API大部分是相同的(我相信相同的創建者),並且SLF4J不需要明確的初始化調用,這簡化了一些事情。

+0

只有屬性文件與類相同的目錄中。 – Eddie 2009-06-10 13:25:52

+0

我認爲你是正確的,但也許有一種方法來調整路徑。 – 2009-06-10 13:29:57