所以,这是我的问题:
我有一个消息驱动的bean X,并希望在X的onMessage()方法中使用Logger。让我们假设我的app服务器中运行了一个bean的单个实例,因此,我会在ejbCreate()中初始化log4j。这意味着我必须做这样的事情:
public void ejbCreate() {
PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties"));
}
但是,这没有用。无论我做什么,我总是将我的流作为null,我尝试了其他版本:this.getClass()。getStream()和ResourceBundle。
我将我的属性文件放入test.jar并将其添加到EAR库(我正在使用RAD7)下,并将其反映在我的manifest.mf中。
以前有人遇到过这个问题吗?如果是的话,你是怎么解决的? 感谢你的帮助......
答案 0 :(得分:2)
如果您是从JAR文件中获取此内容,那么您错过了一个原始/
:
Classloader.getResourceAsStream("/xyz_log4j.properties")
根据包含属性文件的目录,您必须指定相对于类层次结构顶部的该目录的路径。例如,如果此属性文件与net.mine.Program
位于同一目录中,那么您将执行此操作:
Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties")
我不相信你可以使用getResourceAsStream()
从META-INF目录中读取,但我从来没有尝试过,也许有办法做到这一点。
答案 1 :(得分:1)
您可以尝试将类名硬编码到负载中。
<name of your class>.class.getResourceAsStream(fileName);
或者,您可能需要查看SLF4J。这是一个可以放在LOG4J顶部的立面。 API大致相同(我相信的创建者相同),SLF4J不需要显式初始化调用,这简化了一些事情。
答案 2 :(得分:1)
我不建议在EJB create方法中配置log4j。可以根据J2EE规范在容器中激活/钝化多个EJBean。因此,您有可能最终多次配置log4j。建议使用保证只调用一次的启动bean。