Jakarta ee 在JEE Web应用程序中使用定制Log4j2插件 背景
我正在开发一个Java web应用程序,打包为EAR中的WAR,它利用Log4j2进行日志记录,在将应用程序部署到开发服务器时遇到了一个问题。日志依赖于一个自定义过滤器(基于答案),该过滤器位于一个单独的JAR中,用于设置每个客户机的日志级别 在我的本地机器上,特别是当EAR通过IDE运行时,将加载过滤器(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秒),因此日
从包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需要它,那么它就已经存在了
期望的解决方案 一个简单的基于配置的修复是理想的。在编写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