我们已经实现了自定义配置工厂,以便以编程方式配置 Log4J2:
ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
初始配置工作正常。
我们的代码中有特定的监听器会触发全局“刷新配置”事件。发生这种情况时,我们需要完全重新配置 Log4J。
我已经尝试了很多选项来告诉 Log4J“重新配置”,但是没有一个能够用新配置充分地重新创建 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,而不是像这样的代码,我认为这是一种 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));
最佳答案
如果你想要一个完整的重新配置,那么使用你的配置工厂来创建一个新的。然后使用 Configurator 类替换配置或调用 LoggerContext 上的 setConfiguration。
关于java - Log4J2 程序化重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35637796/