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

时间:2016-11-07 23:50:33

标签: 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的模拟?我想不出办法。

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

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

1 个答案:

答案 0 :(得分:0)

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

当我尝试将其扩展到无状态会话bean时,这个计划就崩溃了。它对Stateful Beans工作正常。或者我想。最终我找到了Oracle document on EJB Restrictions,揭露了我正在做的事情的弱点。我的“解决方案”包括EJB类的非最终静态LoggerContext成员。我找到了一种让它成为最终的方法,它确实允许无状态案例发挥作用。但我对我的做法越来越不满意了。即使在有状态的情况下,我也发现了一些问题,这些问题可能会在以后的集群环境中引起我的反对。

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

如果EJB被分发到集群中的另一台机器,我甚至无法想象static final LoggerContext的复杂性。像LoggerContext这样的对象不属于容器管理对象(如EJB)的静态或非静态成员。

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

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