1

所以,这是我的问题:
我有一个消息驱动的 bean X,并且想在 X 的 onMessage() 方法中使用 Logger。假设我在我的应用服务器中运行了一个 bean 实例,因此,我将在 ejbCreate() 中初始化 log4j。这意味着我将不得不做这样的事情:

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

但是,这无济于事。无论我做什么,我总是将我的流设为空,我尝试了其他版本:this.getClass().getStream() 和 ResourceBundle。

我将我的属性文件打包到 test.jar 中,并将其添加到 EAR 库下(我使用的是 RAD7),它反映在我的 manifest.mf 中。

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

4

3 回答 3

2

如果您从 JAR 文件中获取此信息,那么您将缺少一个初始值/

Classloader.getResourceAsStream("/xyz_log4j.properties")

根据包含属性文件的目录,您必须指定该目录相对于类层次结构顶部的路径。例如,如果此属性文件与 位于同一目录中net.mine.Program,那么您可以这样做:

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

我不相信您可以使用 读取 META-INF 目录getResourceAsStream(),但我从未尝试过,所以也许有办法做到这一点。

于 2009-06-10T13:11:56.133 回答
1

您可以尝试将类名硬编码到负载中。

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

或者,您可能想查看SLF4J。这是一个可以位于 LOG4J 之上的外观。API 基本相同(我相信是同一个创建者),并且 SLF4J 不需要明确的初始化调用,这稍微简化了一些事情。

于 2009-06-10T13:24:43.783 回答
1

我不建议在 EJB 创建方法中配置 log4j。根据 J2EE 规范,可以随心所欲地在容器上激活/钝化多个 EJBean。因此,您最终可能会多次配置 log4j。推荐使用保证只被调用 1 次的启动 bean。

于 2009-06-11T00:06:03.817 回答