Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为log4j2使用多个配置文件_Java_Xml_Logging_Log4j2_Xinclude - Fatal编程技术网

Java 如何为log4j2使用多个配置文件

Java 如何为log4j2使用多个配置文件,java,xml,logging,log4j2,xinclude,Java,Xml,Logging,Log4j2,Xinclude,我正在编写测试Java库的Java代码。该库包含自己的log4j2配置,作为发行版的一部分 我希望在测试代码中使用log4j2,而不修改库的配置 有没有办法为我的测试代码单独配置log4j2 这一切都是以命令行Java运行的,根本没有服务器或web参与 编辑以尝试更清晰: 我想要的是能够为测试代码配置logger、appender等,同时让库代码为其日志使用自己的单独配置文件。其想法是在测试代码中使用log4j2,但不必更改库的配置文件。由于库配置文件是库发行版的一部分,我不想为了测试而更改它。

我正在编写测试Java库的Java代码。该库包含自己的log4j2配置,作为发行版的一部分

我希望在测试代码中使用log4j2,而不修改库的配置

有没有办法为我的测试代码单独配置log4j2

这一切都是以命令行Java运行的,根本没有服务器或web参与

编辑以尝试更清晰: 我想要的是能够为测试代码配置logger、appender等,同时让库代码为其日志使用自己的单独配置文件。其想法是在测试代码中使用log4j2,但不必更改库的配置文件。由于库配置文件是库发行版的一部分,我不想为了测试而更改它。

这可能会有帮助:

  • Log4j2将首先在类路径中查找Log4j2-test.xml
  • 如果找不到该文件,它将在类路径中查找log4j2.xml
因此,一个选项是将库的配置(log4j2.xml)复制到log4j2-test.xml,并将您自己的配置添加到log4j2-test.xml


此外,Log4j2,因此您可以使用该功能避免在Log4j2 test.xml中复制库的配置。

有两个步骤可以解决您的问题

  • 使用自定义名称创建自己的配置文件(例如:xyz.properties/.xml)
  • 您必须在java运行时命令中添加以下行
cmd>java-Dlog4j.configuration=location/xyz.properties

如果您对配置使用不同的名称,而不是log4j.properties/.xml文件,则需要在运行时通过上述命令配置该文件,以了解更多信息,请查看Log4j2支持的“复合配置”,它完全符合您的要求。您只需在
log4j.configurationFile
属性中提供多个文件的路径。这可以从命令行传递,也可以添加到应用程序中的
log4j2.component.properties
文件中

参考资料:
使用log4j2.XML的备用XML文件的正确格式:

java-Dlog4j.configurationFile=./location/log4j2 custom.xml

假设存在
/location/log4j2 custom.xml
,并且是此运行中替换log4j2.xml的新xml

见:

引用说明可以在log4j2.configurationFile属性下添加多个逗号分隔的文件

要使用多个配置文件,必须根据环境设置

例如:

if (env.equals("DEV")) {
 setConfigFile("log4j2-dev.xml");
}

public static void setConfigFile(String logConfigFile) {
        File file = new File(logConfigFile);
        LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
        context.setConfigLocation(file.toURI());
    }

Log4j从类路径加载配置文件。如果将测试代码类路径放在库类路径之前,则应从测试代码中获取log4j配置。这里有一个关于stackoverflow的问题,这可能会有帮助。谢谢你的回答Alexey,但我认为我的问题不够清楚。我对它进行了编辑以使其更加清晰。谢谢,事实上,我最终合并了测试和分发日志4j2文件。这不是我想要的,但显然没有比这更好的了。我确实尝试过使用Xinclude,但无法使其工作。这还不够重要,不足以花更多的时间让Xinclude策略发挥作用。您在哪里更改“java运行时命令”?我尝试了项目>首选项>运行/调试设置,选择了一些配置,单击了编辑、参数选项卡、VM参数。
first configure application.yaml file
spring:
  profiles:
    active: dev

---
spring:
  message: running in the dev profile    //just to output the message in the log
  profiles: dev
logging.config: classpath:log4j2-dev.xml

---
spring:
  profiles: prod
logging.config: classpath:log4j2-prod.xml



and create these similar files in your classpath
* log4j2-dev.xml
* log4j2-prod.xml