为啥 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

战争未部署到Wildfly 10.1中

Undertow:WAR 文件之外的静态根内容(wildfly)

将 WildFly 8 欢迎内容更改为使用 myapplication.war

在 Wildfly 8.2 中配置日志的正确方法

Spring boot 和 JBoss 8 Wildfly 日志配置应用