Log4j2 configurationFile系统属性仅在maven测试期间工作

时间:2016-03-21 14:59:54

标签: xml maven log4j2 maven-surefire-plugin

我为实现这项工作而苦苦挣扎。 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

2 个答案:

答案 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需要另一个参数来指向它。

来自official F.A.Q. page

  

默认情况下,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.xmllog4j2.xml)并应自动识别。