JBoss EAP 6.4/7 - Spring 引导应用程序的内部 log4j2.xml 配置未在控制台上打印

JBoss EAP 6.4/7 - Spring Boot Application's internal log4j2.xml configuration not printing on console

我查找了类似的问题,但 none 的答案确实解决了问题。我有一个 Spring 引导应用程序配置为使用 slf4j+log4j2(在 src/main/resources 中有一个内部 log4j2.xml 配置)。我在 JBoss EAP(6.4 和 7)上部署了这个 war,并且可以看到来自 JBoss 启动的日志跟踪。问题是 log4j2 appender 不打印任何东西,无论是在控制台上还是在文件上:

这些是我做过的事情:

  1. 我已经调试并检查了 Spring 引导程序的 Log4J2LoggingSystem 是否已使用 classpath:log4j2.xml 文件正确初始化。

  2. 我的应用程序正在使用 SLF4J,在调试时我看到底层日志记录实现是 JBoss' 日志记录而不是 Log4j2

  3. log4j2 日志记录在 Tomcat 上正常工作。

  4. 在 standalone.xml 中,我删除了 <extension module="org.jboss.as.logging"/><subsystem xmlns="urn:jboss:domain:logging:3.0"> 块。这样做之后,只有少数 jboss 痕迹打印在控制台上(但应用程序 log.info() 没有任何痕迹),但 log4j2 文件附加程序打印正确。

如何在配置 JBoss 中支持应用程序 log4j2.xml 在控制台和文件上打印?

log4j2.xml 摘录:

<Configuration status="WARN">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout ...
        <RollingFile name="file"
            filePattern="'.'%d{yyyy-MM-dd}"
            fileName="c:\logs\out.log">
            <PatternLayout
                pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - %c{1.} %5p - %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    <Logger name="org.springframework" level="info" additivity="false">
        <AppenderRef ref="file" />
        <AppenderRef ref="console" />
    </Logger>
</Configuration>

更新

问题与 JBoss 管理 SLF4J 的方式有关:

org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(PresupuestoController.class);
org.apache.logging.log4j.Logger log4j2Logger = LogManager.getLogger(PresupuestoController.class);

如果我运行slf4jLogger.info("SLF4J!!!");。它使用底层 JBoss Logger:

打印
11:19:03,122 INFO  [com.my.web.SomeController] (default task-2) SLF4J!!!

但是当我执行 log4j2Logger.info("LOG4J2!!!"); 时,它会按照我的 log4j2.xml 配置在控制台上打印:

11:19:03,668 INFO  [stdout] (default task-2) 2016-05-19T11:19:03.663  c.m.w.SomeController  INFO - LOG4J2!!!

根据要求,我必须在代码中使用 SFL4J,所以我需要一种方法来强制它使用 Log4j2 而不是 JBoss。

我也很难让 log4j2 在 JBoss 6 上工作。

如果您是 运行 网络应用程序,请将 xml 配置文件放在 src/main/webapp/WEB-INF/log4j2 下。xml

还要确保您拥有正确的依赖项,显然,由于您设置为 'WARN',您至少要记录 WARN/ERROR 级别。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>

在为此苦苦挣扎之后,终于解决了这个问题:将一个jboss-deployment-structure.xml文件添加到我的 WEB-INF 文件夹中,内容如下:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name='org.slf4j' />
            <module name='org.slf4j.impl' />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

现在 JBoss 日志记录继续工作,但也允许我在我的应用程序代码中使用 SFL4J + Log4j2。

对于 EAR 应用程序 (Spring MVC),我必须将此 jboss-deployment-structure.xml 放入 META-INF:

<jboss-deployment-structure>
    <deployment>  
      <exclude-subsystems>  
          <subsystem name="logging"/>  
      </exclude-subsystems>  
    </deployment> 
</jboss-deployment-structure>
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
   <deployment>
      <exclusions>
         <module name="org.apache.commons.logging" />
         <module name="org.apache.log4j" />
         <module name="org.jboss.logging" />
         <module name="org.jboss.logging.jul-to-slf4j-stub" />
         <module name="org.jboss.logmanager" />
         <module name="org.jboss.logmanager.log4j" />
         <module name="org.slf4j" />
         <module name="org.slf4j.impl" />
      </exclusions> 
   </deployment>
</jboss-deployment-structure>