【问题标题】:Log4j for Message Driven Beans用于消息驱动 Bean 的 Log4j
【发布时间】:2009-06-10 11:53:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您是从 JAR 文件中获取此信息,那么您会丢失初始的 /

    Classloader.getResourceAsStream("/xyz_log4j.properties")
    

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 什么是启动bean?以及如何确保它只被调用一次?
      • n 应用程序启动 bean 是在应用程序启动时加载的会话 bean。应用程序启动 bean 使 J2EE 应用程序能够在应用程序正常启动或停止时自动运行业务逻辑,尽管只有一次。
      【解决方案3】:

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

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

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

      【讨论】:

      • 仅当属性文件与类位于同一目录时。
      • 我认为你是对的,但也许有办法调整路径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2017-06-13
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多