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 需要一个进一步的参数来指向它。

来自official F.A.Q. page

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.xmllog4j2.xml) 并且应该被自动识别。