3

我正在做以下事情:将几个遗留应用程序从 WebLogic 移植到 JBoss EAP 7。一些被移植的组件是 EJB。其他的是调用这些 EJB 的 servlet 应用程序。这些 EJB 部署在 ejb-jar 中。我知道我可以将整个事情包装到一个大的 EAR 文件中,但我们不想这样做。servlet 和 EJB jar 需要是可单独部署的组件。

然后是日志记录设置。我们正在使用 log4j2,我们希望保持独立于 JBoss 日志记录设置。我创建了一个 JBoss 模块,其中包含所有具有适当依赖关系的 log4j2 jar,并且日志记录有效。servlet 运行并记录、调用 EJB 并且它们工作。

唯一的问题是如何配置 EJB 的日志记录。在像 servlet 这样的 Web App 中,这很简单,只需在 web.xml 中指定 log4j 日志记录配置文件即可。ejb jar 的模拟是什么?我想不出办法。

我尝试了以下操作:将记录器/附加程序添加到 EJB 包的 servlet 应用程序的配置中,并指定一个新文件。它不起作用。确实会创建新的日志文件,但不会将任何内容写入日志文件。应该有输出,但是没有,所以很明显,当 EJB 运行时,它的 LogManager 没有使用 servlet 中指定的配置。

在部署在 JBoss EAP7 上的 EJB jar 中的 EJB 中指定 log4j2 配置的正确方法是什么?

4

1 回答 1

0

我之前在这个空间中发布了一个解决方案,涉及使用 @postConstruct 和 @preDestroy 方法来初始化和关闭 LoggerContext 对象。

当我试图将它扩展到无状态会话 bean 时,这个计划失败了。它适用于有状态的 Bean。或者我是这么想的。最终,我找到了一份关于 EJB 限制的 Oracle 文档,该文档暴露了我所做工作的弱点。我的“解决方案”包括 EJB 类的非最终静态 LoggerContext 成员。我找到了一种让它最终化的方法,它确实允许无状态案例工作。但我对我的方法越来越不满意。即使在有状态的情况下,我也发现了稍后在集群环境中可能会困扰我的问题。

我现在开始相信的是,我不应该做我想做的事。

我什至无法想象static final LoggerContext如果将 EJB 分发到集群中的另一台机器会是什么样子的复杂性。像 LoggerContext 这样的对象不属于 EJB 等容器管理对象的成员(无论是否静态)。

甚至不清楚 EJB 是否是我正在尝试构建的正确实现技术。我的用例并不是真正的事务性,因此 EJB 实现的情况并不强大,因此一种可能的路径完全远离 EJB。

真正的信息是,如果指定了 EJB 或其他容器管理的组件,最好使用容器提供的日志记录系统。我喜欢 log4j2,但在 JBoss 支持之前,最好坚持使用容器提供的 log4j1 或其他一些框架。

于 2016-11-18T18:38:41.797 回答