我们已经实现了一个自定义配置工厂,以便通过编程方式配置Log4J2:
我该如何在Log4J2中触发全局重新配置事件,以便它将丢弃其整个配置,然后完全重新配置自己?
编辑:经过进一步调查和调试,似乎记录器配置也没有被更新。记录器设置的初始级别保持不变。不会构建
编辑2:我已经成功实现了一个解决方案,但是实现非常糟糕,我只能假设这是偶然而非设计的结果。
我的工作是实现一个通用框架来支持编程重配置,因此实现不应该脆弱/有缺陷。我希望有一种正确的方法来完全重新配置Log4J2,而不是像下面这样的代码,我认为这是一个hack。 编辑3:解决方案:根据下面接受的答案,我已将我的代码更改为以下内容:
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
初始配置运行正常。
我们在代码中有一些监听器,触发全局“刷新配置”事件。当这种情况发生时,我们需要完全重新配置Log4J。
我尝试了许多选项来告诉Log4J“重新配置”,但没有一个能够充分重建具有新配置的Appenders。
这是我找到的最接近的方法,但它对于Appender配置无效:
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
LoggerContext ctx = (LoggerContext) LogManager.getContext();
ctx.reconfigure();
ctx.updateLoggers();
我该如何在Log4J2中触发全局重新配置事件,以便它将丢弃其整个配置,然后完全重新配置自己?
编辑:经过进一步调查和调试,似乎记录器配置也没有被更新。记录器设置的初始级别保持不变。不会构建
org.apache.logging.log4j.core.Logger.PrivateConfig
的新实例。编辑2:我已经成功实现了一个解决方案,但是实现非常糟糕,我只能假设这是偶然而非设计的结果。
LoggerContext ctx = (LoggerContext) ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).getContext();
for(org.apache.logging.log4j.core.Logger l : ctx.getLoggers())
{
l.getContext().onChange((Reconfigurable) ctx.getConfiguration());
}
ctx.reconfigure();
我的工作是实现一个通用框架来支持编程重配置,因此实现不应该脆弱/有缺陷。我希望有一种正确的方法来完全重新配置Log4J2,而不是像下面这样的代码,我认为这是一个hack。 编辑3:解决方案:根据下面接受的答案,我已将我的代码更改为以下内容:
ConfigurationFactory configFactory = new MyConfigurationFactory();
ConfigurationFactory.setConfigurationFactory(configFactory);
org.apache.logging.log4j.core.LoggerContext ctx = (org.apache.logging.log4j.core.LoggerContext) LogManager
.getContext(false);
ctx.start(configFactory.getConfiguration(ConfigurationSource.NULL_SOURCE));