Log4J2程序化重新配置

时间:2016-02-25 20:37:21

标签: java log4j2

我们已经实现了一个自定义配置工厂,以便以编程方式配置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));

1 个答案:

答案 0 :(得分:1)

如果要完整重新配置,请使用配置工厂创建新工厂。然后使用Configurator类替换LoggerContext上的配置或调用setConfiguration。