我们已经实现了一个自定义配置工厂,以便以编程方式配置Log4J2:
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
初始配置正常。
我们的代码中有一些侦听器会触发全局“刷新配置”事件。发生这种情况时,我们需要完全重新配置Log4J。
我已经尝试了很多选项来告诉Log4J'reconfigure',但是没有一个选项可以用新配置充分重新创建Appender。
这是我找到的最接近的东西,但它对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,而不是像我这样的代码,我会认为是黑客攻击。
编辑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));
答案 0 :(得分:1)
如果要完整重新配置,请使用配置工厂创建新工厂。然后使用Configurator类替换LoggerContext上的配置或调用setConfiguration。