我正在尝试从运行时提供的特定位置加载 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 个方法就会开始有所不同。如果之前调用了任何 LogManager
的 get*
方法(例如在静态初始化程序中),则可能会发生这种情况。如果发生这种情况,前两个方法将替换该上下文的配置,而后两个方法则不执行任何操作。
PropertyConfigurator
和 DOMConfigurator
工作方式不同:除非您使用 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/