通过指定路径在运行时加载log4j2.xml或属性配置文件

z4bn682m  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在尝试从运行时提供的特定位置加载log4j2.xml或属性文件。这是从log4j 1.x到log4j 2.x版本迁移的一部分。我发现log4j 2中的日志配置加载顺序有很多变化。因此,在搜索之后,我现在有以下方法-
1个-

Configurator.reconfigure(new URI("URI of your file"));

二-

// import org.apache.logging.log4j.core.LoggerContext;
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File("path/to/a/different/log4j2.xml");

// this will force a reconfiguration
context.setConfigLocation(file.toURI());

但是他们说LoggerContext类不是公共API的一部分,现在还是这样吗?
3-

InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml");
ConfigurationSource source = new ConfigurationSource(inputStream);
Configurator.initialize(null, source);

4-或者干脆

Configurator.initialize(null, "/path/to/log4j2.xml");

我很困惑,如果所有这些都是可行的,或将用于不同的情况下,并有不同的结果。
另外,我试图替换的函数是DOMConfigurator和PropertyConfigurator。我知道log4j 2会自动在类路径中找到配置,但如果我有多个配置文件用于不同的环境等或场景,或者配置文件在类路径之外,在系统的其他地方-我试图使用以上这些函数来完成。请帮助我,因为我在这里卡住了,谢谢。

6mw9ycah

6mw9ycah1#

如果没有LoggerContext与调用方相关联,则所有这些方法都具有相同的效果:他们创建一个LoggerContext并使用提供的配置源对其进行配置。
如果有一个LoggerContext与调用者相关联,这4个方法就开始不同。如果任何LogManagerget*方法之前被调用过(例如在静态初始化器中),就会发生这种情况。如果发生这种情况,前两个方法将替换该上下文的配置,而后两个方法是无操作的。
Log4j 1.x中的PropertyConfiguratorDOMConfigurator的工作方式不同:除非你使用了log4j.reset=true键,否则它们修改了以前的配置。虽然这两个类已经移植到了最新的log4j-1.2-api,但是“reset”语义没有实现,它们的行为就像Configurator.reconfigure一样,只限于一种配置格式。

备注Configurator.reconfigure会尝试猜测配置格式以选择适当的ConfigurationFactory。由于Log4j 2.x和Log4j 1.x都具有属性和XML格式,因此所有属性和XML文件都将被解释为本地Log4j2配置文件。请检查this question以获得解决方法。

相关问题