为啥 WildFly 控制台日志会劫持我的 WAR 的 log4j 日志?
Posted
技术标签:
【中文标题】为啥 WildFly 控制台日志会劫持我的 WAR 的 log4j 日志?【英文标题】:Why is the WildFly console log hijacking my WAR's log4j log?为什么 WildFly 控制台日志会劫持我的 WAR 的 log4j 日志? 【发布时间】:2019-05-19 09:02:17 【问题描述】:我有 7 个不同的 WAR 部署到同一个 WildFly / JBoss 服务器。每个 WAR 在核心设计和 Log4j 配置上都是相同的。每个 WAR 通过自己的自定义 log4j.xml 生成自己的日志文件。每个日志都写入一个单独的文件夹。
7 个已部署的 WAR 中有 1 个不断被 WildFly 的 console.log 劫持日志记录。它将在初始化期间开始写入自己的日志 5-10 行,然后停止;其余的日志记录将被定向到 console.log。
如果我在发生这种情况后重新安装 WAR,它将同时写入自己的个人日志和 WildFly 控制台日志。如果我重新启动 WildFly,它的行为将如前所述 - 开始记录到它自己的日志,然后在 console.log 上继续。
与其他 6 个 WAR 相比,这个 WAR 唯一的独特之处在于这个项目使用 JAXB;其他 WAR 都没有使用 JAXB。
JAXB 与 Log4j 和 WildFly 之间是否存在某种未知的交互可能会导致这种情况?我怀疑,但还不能证明,劫持发生在使用 JAXB 的类被加载之后类加载器。
jboss-7.2.0.Final,jdk-7u80x64,Log4j-1.2.13.jar
【问题讨论】:
不是 100%,但有时 Jboss/wildfly 使用自己的 jar,而不是内置在 wars/ears 中的 jar,因此您可能需要将排除项放入 Jboss 部署描述符 xml。 @achAmháin 其他不受此影响的 WAR 也使用相同的 Log4j jar;为什么这个单一的战争特别? 我不确定。也许只是尝试在部署描述符中排除 JBoss 自己的 JAXB 模块(假设有一些),看看它是否有任何影响。我在 EAP 7 中遇到了 log4j 问题,最终将它们排除在外,并在每个自己的 war 文件中使用日志记录。 您是使用jboss-deployment-structure.xml
排除日志子系统还是org.apache.log4j
模块?
@JamesR.Perkins 不,我不是。这是这类问题的潜在原因,还是我应该采用的治疗方法?我怀疑你在寻找原因。
【参考方案1】:
通过/WEB-INF/jboss-deployment-structure.xml
从应用程序中排除log4j模块解决
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
</deployment>
</jboss-deployment-structure>
【讨论】:
【参考方案2】:您可能需要尝试将 logging.properties 文件移动到 WAR/WEB-INF/classes。我猜是旧的 Jboss EAP 6.4,可能存在无法查看 WAR/WEB-INF 目录的错误。
如果这不起作用,您必须为 org.jboss.as.logging 打开跟踪日志记录,这应该会显示在您的部署中找到了 logging.properties 文件。
以下 CLI 命令将启用跟踪日志记录,以查看日志记录子系统正在执行的操作的详细信息。
/subsystem=logging/logger=org.jboss.as.logging:add(level=TRACE)
如果您想在控制台上看到这些日志消息,您需要为控制台工具启用跟踪日志记录。
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=level, value=TRACE)
资源:
sect-per-deployment_logging
Logging Configuration
【讨论】:
这个war文件总是在classes文件夹下有日志属性,而不是简单地在web-inf文件夹下。以上是关于为啥 WildFly 控制台日志会劫持我的 WAR 的 log4j 日志?的主要内容,如果未能解决你的问题,请参考以下文章
wildfly 部署war包standalone 部署为啥要 war.deployed
Undertow:WAR 文件之外的静态根内容(wildfly)