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

Loading log4j2.xml or properties configuration file during runtime by specifying path

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

1 -

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

2 -

// 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 class 不是 public 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。我知道 log4j2 会在 classpath 中自动找到配置,但如果我有多个针对不同环境等或场景的配置文件,或者配置文件在 classpath 之外,在系统的其他地方 - 我正在尝试使用以上这些功能来做到这一点。 请帮忙,因为我被困在这里,谢谢。

如果没有 LoggerContext 与调用者关联,所有这些方法都具有相同的效果:它们创建一个 LoggerContext 并使用提供的配置源对其进行配置。

如果有一个 LoggerContext 与调用者相关联,这 4 个方法开始不同。如果之前调用了任何 LogManagerget* 方法(例如在静态初始化程序中),就会发生这种情况。如果发生这种情况,前两个方法将 替换 该上下文的配置,而后两个是 no-ops.

Log4j 中的

PropertyConfiguratorDOMConfigurator 1.x 工作方式不同:除非您使用 log4j.reset=true 键,否则它们 修改了 以前的配置.虽然这两个 类 已移植到最新的 log4j-1.2-api,但“重置”语义未实现,它们的行为类似于 Configurator.reconfigure 仅限于单一配置格式。

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