Log4j2 配置文件系统 属性 仅在 maven 测试期间工作
Log4j2 configurationFile system property only working during maven tests
我一直在努力让这个工作。 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
执行测试用例并登录到我在配置中定义的文件时,这非常有效。但是,当我在我的网络应用程序中替换这个内置的 jar 时,它无法记录任何内容,并不断抛出有关未找到 log4j2 配置 xml 的错误。
问题:还有什么地方需要定义这个系统吗属性?
注意:我的项目中没有 web.xml
。
Surefire 插件仅在构建生命周期的测试阶段使用。此处设置的系统属性仅用于在 Maven 构建期间注入,而不是在应用程序 运行ning.
时注入
编译并运行 JAR 后,这将使用主机的系统属性或您作为参数传递的属性。
假设您正在 运行 将您的 JAR 添加为:
java -jar myjar.jar
你可以设置log4j 属性:
java -Dlog4j.configurationFile=src/main/resources/metrics-log4j2.xml -jar myjar.jar
On a side note:
systemProperties
已弃用。
你能试试 systemPropertyVariables
吗?
此处提供文档:
https://maven.apache.org/components/surefire/maven-surefire-plugin/examples/system-properties.html
您将系统 属性 指定为 Maven Surefire 插件的一部分,该插件仅适用于执行的测试,这就是配置对您的最终应用程序不可见的原因。
但是,配置文件位于 /src/main/resources
下,因此它仍将与项目工件一起运送(打包)。但它没有标准(默认)名称,因此 log4j2 需要一个进一步的参数来指向它。
By default, Log4j looks for a configuration file named log4j2.xml
(not log4j.xml
) in the classpath.
ou can also specify the full path of the configuration file with this system property:
-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
) 并且应该被自动识别。
我一直在努力让这个工作。 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
执行测试用例并登录到我在配置中定义的文件时,这非常有效。但是,当我在我的网络应用程序中替换这个内置的 jar 时,它无法记录任何内容,并不断抛出有关未找到 log4j2 配置 xml 的错误。
问题:还有什么地方需要定义这个系统吗属性?
注意:我的项目中没有 web.xml
。
Surefire 插件仅在构建生命周期的测试阶段使用。此处设置的系统属性仅用于在 Maven 构建期间注入,而不是在应用程序 运行ning.
时注入编译并运行 JAR 后,这将使用主机的系统属性或您作为参数传递的属性。
假设您正在 运行 将您的 JAR 添加为:
java -jar myjar.jar
你可以设置log4j 属性:
java -Dlog4j.configurationFile=src/main/resources/metrics-log4j2.xml -jar myjar.jar
On a side note:
systemProperties
已弃用。
你能试试 systemPropertyVariables
吗?
此处提供文档: https://maven.apache.org/components/surefire/maven-surefire-plugin/examples/system-properties.html
您将系统 属性 指定为 Maven Surefire 插件的一部分,该插件仅适用于执行的测试,这就是配置对您的最终应用程序不可见的原因。
但是,配置文件位于 /src/main/resources
下,因此它仍将与项目工件一起运送(打包)。但它没有标准(默认)名称,因此 log4j2 需要一个进一步的参数来指向它。
By default, Log4j looks for a configuration file named
log4j2.xml
(notlog4j.xml
) in the classpath.
ou can also specify the full path of the configuration file with this system property:
-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
) 并且应该被自动识别。