Log4j2 不在 EAR 中记录来自 WAR 和非 EJB jar 的语句

Log4j2 not logging statements from WAR and Non-EJB jars in an EAR

我在 Wildfly-8.2.0.Final AS$JBOSS_HOME/standalone/deployments 部署了一个未打包的 EAR。它包含解压缩的 WAR 和应用程序 jar 文件。

HelloWorldEar-0.0.1-SNAPSHOT.ear
-HelloWorldServlet-0.0.1-SNAPSHOT.war
-lib
-META-INF
-aspectjrt-1.8.6.jar
-HelloWorldAnnotation-0.0.1-SNAPSHOT.jar
-HelloWorldAspect-0.0.1-SNAPSHOT.jar
-HelloWorldCommonLib-0.0.1-SNAPSHOT.jar
-HelloWorldEJB-0.0.1-SNAPSHOT.jar
-log4j2.xml
EAR

lib 文件夹包含与 log4j2 相关的 APIs,用于提供日志记录功能。

lib
-commons-logging-1.2.jar
-HelloWorldLog4jPlugin-0.0.1-SNAPSHOT.jar (Jar containing custom log4j2 plugins)
-log4j-api-2.4.1.jar
-log4j-core-2.4.1.jar
-log4j-jcl-2.4.1.jar
-log4j-web-2.4.1.jar

我正在通过在 HelloWorldEJB-0.0.1-SNAPSHOT.jar.

中的启动单例 bean 中初始化 log4j2.xml 来初始化 log4j2 配置
String path = System.getProperty("jboss.home.dir")
                + "/standalone/deployments/HelloWorldEar-0.0.1-SNAPSHOT.ear/log4j2.xml";
ConfigurationSource source;
        File configFile = new File(path);
        try {
            source = new ConfigurationSource(new FileInputStream(configFile), configFile);
            Configurator.initialize(null, source);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

log4j2.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Appenders>
<RollingFile name="SERVER_FILE" fileName="${sys:LOGS}/sample.log" filePattern="${sys:LOGS}/sample.log.%i" append="true">
<PatternLayout>
<pattern>%d %-5p [%c{1}] [EventId: %e] [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="500 KB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout>
<pattern>%d{ABSOLUTE} %-5p [%c{1}] %m%n</pattern>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Logger name="com.test.prototype.log4j" level="debug">
<AppenderRef ref="SERVER_FILE"/>
</Logger>
<Root level="debug" additivity="false">
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>

所有子包和类都定义在包com.test.prototype.log4j下。

HelloWorldEJB-0.0.1-SNAPSHOT.jar 的 类 中添加的日志语句被记录在日志文件中。

我的问题是 1. 来自其他应用程序 jar 和 WAR 的日志语句没有被记录到日志文件中。 2. 尽管添加了 log4j2 所需的系统参数,但无法通过 commons-logging API 进行日志记录。

System.setProperty("org.apache.commons.logging.Log",
                "org.apache.commons.logging.impl.Log4JLogger");

我已经尝试在应用程序 jars 中添加 class-path 并在 WAR 文件的 web.xml 中的监听器下方添加,但没有任何效果。 org.apache.logging.log4j.web.Log4jServletContextListener

我需要 log4j2.xmlEAR 下,它应该为 EAR 中添加的所有应用程序 jar 和 WAR 提供服务器。谁能帮我解决这个问题。

您是否尝试过使用系统 属性 -Dlog4j.configurationFile=path/to/log4j2.xml 指定 log4j2.xml 配置文件位置? 我怀疑您现在初始化 log4j 的方式在其他 WAR 中是不可见的。

如果失败,请在 log4j2 Jira 问题跟踪器上提出这个问题。 https://issues.apache.org/jira/browse/LOG4J2