Log4j用于消息驱动的Bean

时间:2009-06-10 11:53:59

标签: java logging java-ee log4j message-driven-bean

所以,这是我的问题:
我有一个消息驱动的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中。

以前有人遇到过这个问题吗?如果是的话,你是怎么解决的? 感谢你的帮助......

3 个答案:

答案 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。