ejb - log4j2 在 JBoss EAP 7 上记录 EJB jar 中的代码

标签 ejb log4j2 jboss-eap-7

我正在执行以下操作: 将多个遗留应用程序从 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/

相关文章:

Log4j2每日日志文件

java - Jboss 7.1部署war web应用时如何配置jndi引用名workmanger和timer

java - 无法将 org.apache.qpid.jms.provider.amqp.AmqpProviderFactory 转换为 org.apache.qpid.jms.provider.ProviderFactory

java - 错误 [org.jboss.resteasy.resteasy_jaxrs.i18n](默认任务 2)RESTEASY002010

java - 没有可用的 EjbContext

project - 使用 EAR 内容文件夹将外部 jar 添加到 EJB 项目

jpa - 如何动态修改@PersistenceContext 中的unitName

java - WFLYJPA0060 : Transaction is required to perform this operation (either use a transaction or extended persistence context)

java - log4j配置文件和jar应用程序

java - 设置带日期的日志文件名