java - Log4J2 程序化重构

标签 java log4j2

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

相关文章:

java - Parcelable 读取 Serialized 对象时遇到 ClassNotFoundException

java - 调用同一个类中的方法

java - 记录器消息的过滤级别

java - 在 Mac 应用程序中嵌入 Java (.jar) 文件

java - 每次加载图像时堆都会增长

java - Log4j2:日志堆栈跟踪没有异常

java - log4j2 中的 BasicConfigurator 替换

java - log4j Java 配置出现问题

java - 发布请求和读取响应时读取超时/连接超时意味着什么 (Java 8)

java - log4j2 中增强的 Throwable 渲染器