如何以编程方式读取Log4j 2配置,解决启动阶段获取配置异常问题
Log4j v2启动阶段读取自定义配置属性问题
我正在使用第三方log4j v2 Appender组件,它支持接入我自主编写的自定义类,接入后Appender会通过反射机制创建这些自定义类的实例。
也就是说:我的自定义类是由Appender负责实例化的,而Appender本身是Log4j正常启动流程的一部分,我无法控制这个第三方库提供的Appender的实例化逻辑。
我希望从Log4j配置中读取自定义类需要使用的若干属性,这些属性本身和日志功能相关,放在Log4j配置中是合理的。
目前我还没有找到正确的实现方案,现在我在自定义类的构造方法中写了如下代码:
LoggerContext loggerContext = LoggerContext.getContext(true); if (loggerContext != null) { Configuration config = loggerContext.getConfiguration(); if (config != null) { StrSubstitutor strSubstitutor = config.getStrSubstitutor(); if (strSubstitutor != null) { StrLookup variableResolver = strSubstitutor.getVariableResolver(); if (variableResolver != null) { String myVar = variableResolver.lookup("myPropertyName"); } } } }
但这段逻辑存在问题:在启动阶段执行上述代码时,Log4j的配置还没有完成初始化,因此调用
LoggerContext.getContext(true).getConfiguration()
返回的是DefaultConfiguration实例,这个实例里显然不包含我自定义的属性。我实际想要获取的是XmlConfiguration实例,在Log4j完全启动完成之后的任意时间调用上述代码,都能正常拿到XmlConfiguration实例,也能正常读取到我定义的自定义属性。
内容的提问来源于stack exchange,提问作者peterh
相关产品推荐
相关产品推荐

