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.xml
在 EAR
下,它应该为 EAR 中添加的所有应用程序 jar 和 WAR 提供服务器。谁能帮我解决这个问题。
您是否尝试过使用系统 属性 -Dlog4j.configurationFile=path/to/log4j2.xml
指定 log4j2.xml 配置文件位置?
我怀疑您现在初始化 log4j 的方式在其他 WAR 中是不可见的。
如果失败,请在 log4j2 Jira 问题跟踪器上提出这个问题。 https://issues.apache.org/jira/browse/LOG4J2
我在 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
.
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.xml
在 EAR
下,它应该为 EAR 中添加的所有应用程序 jar 和 WAR 提供服务器。谁能帮我解决这个问题。
您是否尝试过使用系统 属性 -Dlog4j.configurationFile=path/to/log4j2.xml
指定 log4j2.xml 配置文件位置?
我怀疑您现在初始化 log4j 的方式在其他 WAR 中是不可见的。
如果失败,请在 log4j2 Jira 问题跟踪器上提出这个问题。 https://issues.apache.org/jira/browse/LOG4J2