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 不打印任何东西,无论是在控制台上还是在文件上:
在控制台中仅显示 jboss 日志记录(我的应用程序中的每个 log.info() 都使用 jboss 日志记录格式).
创建了一个c:\logs\out.log
文件,但上面没有写入任何内容。
这些是我做过的事情:
我已经调试并检查了 Spring 引导程序的 Log4J2LoggingSystem
是否已使用 classpath:log4j2.xml
文件正确初始化。
我的应用程序正在使用 SLF4J,在调试时我看到底层日志记录实现是 JBoss' 日志记录而不是 Log4j2
log4j2 日志记录在 Tomcat 上正常工作。
在 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>
我查找了类似的问题,但 none 的答案确实解决了问题。我有一个 Spring 引导应用程序配置为使用 slf4j+log4j2(在 src/main/resources
中有一个内部 log4j2.xml 配置)。我在 JBoss EAP(6.4 和 7)上部署了这个 war,并且可以看到来自 JBoss 启动的日志跟踪。问题是 log4j2 appender 不打印任何东西,无论是在控制台上还是在文件上:
在控制台中仅显示 jboss 日志记录(我的应用程序中的每个 log.info() 都使用 jboss 日志记录格式).
创建了一个
c:\logs\out.log
文件,但上面没有写入任何内容。
这些是我做过的事情:
我已经调试并检查了 Spring 引导程序的
Log4J2LoggingSystem
是否已使用classpath:log4j2.xml
文件正确初始化。我的应用程序正在使用 SLF4J,在调试时我看到底层日志记录实现是 JBoss' 日志记录而不是 Log4j2
log4j2 日志记录在 Tomcat 上正常工作。
在 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>