我为实现这项工作而苦苦挣扎。 Log4j2文档要求定义log4j.configurationFile
系统属性以定义自定义配置路径。我在pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<excludes>
<exclude>**/RequestMetricsTest.java</exclude>
<exclude>**/SessionMetricsTest.java</exclude>
</excludes>
<systemProperties>
<property>
<name>log4j.configurationFile</name>
<value>src/main/resources/metrics-log4j2.xml</value>
</property>
</systemProperties>
</configuration>
</plugin>
当我运行执行测试用例并登录到我在配置中定义的文件的mvn install
时,这非常有效。但是,当我在我的web-app中替换这个构建的jar时,它无法记录任何内容并继续抛出有关找不到log4j2配置xml的错误。
问题:我还需要在其他地方定义此系统属性吗?
注意:我的项目中没有web.xml
。
答案 0 :(得分:1)
Surefire插件仅在构建生命周期的测试阶段使用。此处设置的系统属性仅用于在Maven构建期间进行注入,而不是在应用程序运行时进行注入。
编译并运行JAR后,这将使用主机的系统属性或作为参数传递的系统属性。
假设你正在运行你的JAR:
java -Dlog4j.configurationFile=src/main/resources/metrics-log4j2.xml -jar myjar.jar
您可以设置log4j属性:
systemProperties
旁注:
systemPropertyVariables
已被弃用。
请您尝试使用{{1}}。
此处提供的文档: https://maven.apache.org/components/surefire/maven-surefire-plugin/examples/system-properties.html
答案 1 :(得分:1)
您正在将系统属性指定为Maven Surefire插件的一部分,该插件仅适用于已执行的测试,这就是为什么配置对您的最终应用程序不可见。
但是,配置文件位于/src/main/resources
下,因此它仍将随项目工件一起发货(打包)。但它没有标准(默认)名称,因此log4j2需要另一个参数来指向它。
默认情况下,Log4j在类路径中查找名为
log4j2.xml
(不是log4j.xml
)的配置文件。
您还可以使用此系统属性指定配置文件的完整路径:
-Dlog4j.configurationFile=path/to/log4j2.xml
如果您想将其应用到您的网络应用程序,根据official documentation,您应该向您添加以下web.xml
文件
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/metrics-log4j2.xml</param-value>
</context-param>
但是既然你提到你的项目中没有web.xml
文件(怎么来?)你可以简单地将其重命名为默认名称(从metrics-log4j2.xml
到log4j2.xml
)并应自动识别。