我在多个项目上使用 Log4j2(2.17.1) 和两种类型的配置(log4j.prop 和 log4j2.xml)。我的应用程序的 log4j2 在读取外部 log4j 配置时可以在 Tomcat 9 上正常工作。但不知何故,当我将我的应用程序部署到 JBoss EAP 7 上时,它停止工作或仅登录到 server.log。所以我认为问题来自 JBoss,我需要一种方法来告诉它不要弄乱我自己的 Log4j2。有谁知道怎么做吗?
JBoss EAP 7.4 有一个新模块,它将 log4j-api 日志委托给 jboss-logmanager。如果您想使用 log4j 日志管理器 (log4j-core),那么您需要从部署中排除一些模块。
我想说下面的选项 1 是首选,因为它只影响单个部署。选项 2 将影响所有部署。
将
jboss-deployment-structure.xml
添加到您的部署中:
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.logging.log4j.api" />
</exclusions>
</deployment>
</jboss-deployment-structure>
将日志子系统中的
add-logging-api-dependencies
属性更改为 false
。
CLI 示例:
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
此问题的根本原因与 JBoss EAP Logging 搜索的“ClassLoader”有关,以便找到适当的日志记录提供程序实现。此搜索按以下顺序进行:
由于 JBoss EAP LogManager 和 Log4j2 在类路径中都可用,因此由于“更高的优先级”,将使用 JBoss EAP LogManager。因此,您必须在日志子系统中设置
use-deployment-logging-config=false
。
此外,JBoss EAP LogManager 还在其自己的实现中使用 Log4j2 中的类。这就是为什么必须从部署中排除模块 org.apache.log4j
和 org.apache.commons.logging
才能使 Log4J2 正常工作。
首先,您应该确保使用正确版本的 log4j2,导入此包的依赖项、api 和 core 以启用 log4j2。 接下来创建 log4j 包的排除项。 按照 oracle 指南上的附加程序和记录器创建配置文件,即指向控制台和滚动文件。 应该是这样,配置文件的名称可能会被它自动识别,以防它不在您的项目中使用查找来查找引用。 另一种选择是使用服务器定义的 JNDI