我正在尝试从运行时提供的特定位置加载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会自动在类路径中找到配置,但如果我有多个配置文件用于不同的环境等或场景,或者配置文件在类路径之外,在系统的其他地方-我试图使用以上这些函数来完成。请帮助我,因为我在这里卡住了,谢谢。
1条答案
按热度按时间6mw9ycah1#
如果没有
LoggerContext
与调用方相关联,则所有这些方法都具有相同的效果:他们创建一个LoggerContext
并使用提供的配置源对其进行配置。如果有一个
LoggerContext
与调用者相关联,这4个方法就开始不同。如果任何LogManager
的get*
方法之前被调用过(例如在静态初始化器中),就会发生这种情况。如果发生这种情况,前两个方法将替换该上下文的配置,而后两个方法是无操作的。Log4j 1.x中的
PropertyConfigurator
和DOMConfigurator
的工作方式不同:除非你使用了log4j.reset=true
键,否则它们修改了以前的配置。虽然这两个类已经移植到了最新的log4j-1.2-api
,但是“reset”语义没有实现,它们的行为就像Configurator.reconfigure
一样,只限于一种配置格式。备注:
Configurator.reconfigure
会尝试猜测配置格式以选择适当的ConfigurationFactory
。由于Log4j 2.x和Log4j 1.x都具有属性和XML格式,因此所有属性和XML文件都将被解释为本地Log4j2配置文件。请检查this question以获得解决方法。