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

标签 java log4j log4j2

我正在尝试从运行时提供的特定位置加载 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 类不是公共(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 会在类路径中自动查找配置,但如果我有针对不同环境等或场景的多个配置文件,或者配置文件位于类路径之外、系统上的其他位置 - 我正在尝试使用上述函数来执行此操作。 请帮忙,因为我被困在这里,谢谢。

最佳答案

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

如果存在与调用者关联的 LoggerContext,这 4 个方法就会开始有所不同。如果之前调用了任何 LogManagerget* 方法(例如在静态初始化程序中),则可能会发生这种情况。如果发生这种情况,前两个方法将替换该上下文的配置,而后两个方法则不执行任何操作。

Log4j 1.x 中的

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

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

关于java - 在运行时通过指定路径加载log4j2.xml或properties配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71596366/

相关文章:

hibernate - Log4j + hibernate 5 + Weblogic 12.2.1

javascript - Struts Action 类未调用

java - 折叠不可见的 Java Swing 组件的最佳方法

java - 为共享首选项自动生成 getter setter

java - docker 容器中的 Kafka-connect 日志

json - 无法让 Karaf 4.2.6 使用带有 JsonLayout 的 log4j2 记录布局类型

java - log4j2 - StatusLogger 未找到 Log4j 2 配置文件。使用默认配置

java - 将字符串数组添加到 ArrayList

java - 纠结于我的 log4j 属性文件并将输出放入logging.log?

logging - Log4j - 如何从 log4j 隐藏启动配置消息