Jakarta ee 在JEE Web应用程序中使用定制Log4j2插件 背景

Jakarta ee 在JEE Web应用程序中使用定制Log4j2插件 背景,jakarta-ee,plugins,log4j2,ear,Jakarta Ee,Plugins,Log4j2,Ear,我正在开发一个Java web应用程序,打包为EAR中的WAR,它利用Log4j2进行日志记录,在将应用程序部署到开发服务器时遇到了一个问题。日志依赖于一个自定义过滤器(基于答案),该过滤器位于一个单独的JAR中,用于设置每个客户机的日志级别 在我的本地机器上,特别是当EAR通过IDE运行时,将加载过滤器(从包a.b.c加载1个插件需要0.x秒),并按预期工作。在开发服务器上,以及在我的本地计算机上,当通过管理控制台手动导出和加载时,未加载筛选器(从包a.b.c加载0个插件需要0.x秒),因此日

我正在开发一个Java web应用程序,打包为EAR中的WAR,它利用Log4j2进行日志记录,在将应用程序部署到开发服务器时遇到了一个问题。日志依赖于一个自定义过滤器(基于答案),该过滤器位于一个单独的JAR中,用于设置每个客户机的日志级别

在我的本地机器上,特别是当EAR通过IDE运行时,将加载过滤器(
从包a.b.c
加载1个插件需要0.x秒),并按预期工作。在开发服务器上,以及在我的本地计算机上,当通过管理控制台手动导出和加载时,未加载筛选器(
从包a.b.c
加载0个插件需要0.x秒),因此日志记录无法按需运行

EAR布局大致如下所示:

.
├── lib
|   ├── Common.jar
|   |   ├── CustomFilter.class
|   |   └── OtherCustomUtils.class
|   ├── log4j-api.jar
|   ├── log4j-core.jar
|   └── [more third party JARs]
├── WebApp.war
|   ├── WebApp.class
|   └── WEB-INF
|       ├── lib
|       |   ├── log4j-web.jar
|       |   └── [more third party JARs]
|       ├── log4j2.xml
|       └── web.xml
├── SomeEJB.jar
|   └── ClassThatAlsoUsesCommonJar.class
└── META-INF
    └── application.xml

分析与尝试 我的假设是,在初始化和配置Log4j2之前,Common.jar中的类并没有被类加载器加载。以下是我迄今为止所尝试的:

  • 起初我担心这可能是EAR和web模块的类加载器之间的冲突;我想我通过配置已部署的EAR,使其在整个应用程序中只使用一个类加载器,消除了这种可能性,但我可能错了。
    • 从那以后,我的耳朵一直处于这种状态。希望这不会把一切都搞砸
  • 根据“”页面的建议,我目前正在使用log4j web。通过最少的配置,我观察到它几乎在启动web应用程序后立即运行并加载log4j2.xml。在IDE中运行时,我假定Common.jar已经加载,所以这没问题,而在开发服务器(或在本地手动安装)上Common.jar似乎还没有加载,并且对插件的搜索失败。
    • 删除log4j2web并让log4j2在第一次调用时初始化自己似乎并不能解决这个问题(对log4j2的第一次调用发生在对Common.jar中的任何类的第一次调用之前)
    • 日志将访问几个文件和数据库,所以我不想让这个应用程序在没有log4jweb的情况下运行
  • 承认log4jweb是一个web片段,我想尝试将Common.jar作为一个web片段,并通过web应用程序中的web.xml指定它在log4jweb之前加载。我几乎不知道我在这里做什么,所以我可能把事情搞砸了。此外,这需要Common.jar位于WEB-INF/lib中,这可能有什么大不了的?
    • EJB项目依赖于Common.jar,因此需要加载它,但由于我对整个应用程序使用一个类加载器,我假设如果web应用程序先加载它,然后EJB需要它,那么它就已经存在了
我承认,我的假设完全取决于这样一个想法:我的应用服务器并不急于加载EAR的lib目录中所有jar中的所有类


期望的解决方案 一个简单的基于配置的修复是理想的。在编写JEE应用程序时,我充其量还是一个新手,因此,如果在某个地方发现了一个选项,可以显式地指定Common.jar中的所有内容都要预加载(假设它还没有预加载),我也不会感到惊讶

当然,实际的代码更改不是不可能的。我宁愿不去


环境
  • Java版本:1.7.1
  • JEE版本:6
  • Log4j2版本:2.6.2
  • 应用服务器:WebSphere8.5.5.6
  • IDE:RationalSoftwareArchitect8.5(Eclipse3.6?)

类似问题
    • 使用packages属性,可以在本地
    • 应用程序集使用一个类加载器
    • 不使用Maven,packages属性现在可以工作了,questioner似乎没有使用Log4JWeb