我正在执行以下操作: 将多个遗留应用程序从 WebLogic 移植到 JBoss EAP 7。所移植的一些组件是 EJB。其他的是调用这些 EJB 的 servlet 应用程序。这些 EJB 部署在 ejb-jar 中。我知道我可以将整个事情包装到一个大 EAR 文件中,但我们不想这样做。 Servlet 和 EJB jar 需要是单独部署的组件。
然后是日志记录设置。我们正在使用 log4j2,并且希望保持独立于 JBoss 日志记录设置。我创建了一个 JBoss 模块,其中包含具有适当依赖项的所有 log4j2 jar,并且日志记录有效。 Servlet 运行并记录日志,调用 EJB 并且它们工作。
唯一的问题是如何配置 EJB 的日志记录。在像 servlet 这样的 Web 应用程序中,这很简单,只需在 web.xml 中指定 log4j 日志记录配置文件即可。 ejb jar 的模拟是什么?我想不出办法。
我尝试了以下操作:将记录器/附加程序添加到 EJB 包的 servlet 应用程序的配置中,并指定一个新文件。这不起作用。新的日志文件确实已创建,但没有任何内容写入日志文件。应该有输出,但没有,所以显然当 EJB 运行时,它的 LogManager 没有使用 servlet 中指定的配置。
在 JBoss EAP7 上的 EJB jar 中部署的 EJB 中指定 log4j2 配置的正确方法是什么?
最佳答案
我之前曾在此空间发布过一个解决方案,涉及使用 @postConstruct 和 @preDestroy 方法来初始化和关闭 LoggerContext 对象。
当我尝试将其扩展到无状态 session bean 时,该计划失败了。它对于 Stateful Bean 来说效果很好。或者说我是这么想的。最终我找到了一个Oracle document on EJB Restrictions这暴露了我所做的事情的弱点。我的“解决方案”包括 EJB 类的非最终静态 LoggerContext 成员。我找到了一种最终确定的方法,这确实允许无状态的情况发挥作用。但我对自己的做法越来越不满意。即使在有状态的情况下,我也发现了稍后在集群环境中可能会困扰我的问题。
我现在开始相信我不应该做我想做的事。
我什至无法想象如果将 EJB 分发到集群中的另一台机器,静态最终 LoggerContext 会是什么样子的复杂性。像 LoggerContext 这样的对象不属于 EJB 等容器管理对象的成员(无论是否静态)。
甚至不清楚 EJB 是否是我正在尝试构建的内容的正确实现技术。我的用例并不是真正的事务性用例,因此 EJB 实现的理由并不充分,因此一种可能的路径完全远离 EJB。
真正的信息是,如果指定了 EJB 或其他容器管理的组件,那么最好使用容器提供的日志系统。我喜欢 log4j2,但在 JBoss 支持之前,最好坚持使用容器提供的 log4j1 或其他框架。
关于ejb - log4j2 在 JBoss EAP 7 上记录 EJB jar 中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476703/