当前位置: 首页 > 知识库问答 >
问题:

Log4J2编程重构

关宏毅
2023-03-14

为了以编程方式配置Log4J2,我们实现了一个自定义配置工厂:

ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());

初始配置工作正常。

我们的代码中有某些侦听器触发全局“刷新配置”事件。当这种情况发生时,我们需要完全重新配置Log4J。

我已经尝试了许多选项来告诉Log4J重新配置,但是没有一个选项能够充分地用新的配置重新创建应用程序。

这是我找到的最接近的东西,但它不适用于Appender配置:

ConfigurationFactory.setConfigurationFactory(new MyConfigurationFactory());
LoggerContext ctx = (LoggerContext) LogManager.getContext();
ctx.reconfigure();
ctx.updateLoggers();

如何在Log4J2中触发全局重新配置事件,使其放弃整个配置,然后完全配置自身?

编辑:经过进一步的调查和调试,似乎记录器配置也没有更新。记录器的初始级别设置保持不变。不可变类org.apache.logging.log4j.core.Logger的新实例。没有构造Private ateConfig

编辑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个答案

梁存
2023-03-14

如果您想要一个完整的重新配置,那么使用您的配置工厂来创建一个新的配置工厂。然后使用Configurator类替换LoggerContext上的配置或调用setConfiguration。

 类似资料:
  • 现在我花了几天时间在java logger:log4j2上。如果您决定使用一个java logger,那么这种方法相对容易。xml文件。但是,如果您想通过代码创建配置,并通过java进行调整,那么这就有点复杂了。 下面的代码我现在可以管理。我没有成功地重新配置日志级别 每次深度在错误级别停止 您能否帮助指定如何重新加载已编程的log4j2配置? 谢谢

  • 我正在编写一个将以编程方式创建log4j2配置的程序。我在log4j2.xml文件中有一个默认配置。基于列表中的某些数据类型,我必须为每种类型创建/复制log4j配置。配置是为这些类型复制的dailyrolling appender。创建记录器配置,根据数据类型将日志消息写入不同的文件。但每天的滚动并没有发生。 下面是基于数据类型生成log4j配置的代码。如果我需要更改为基于尺寸的滚动,也可以帮助

  • 问题内容: 我试图仅通过使用和此参考来配置和设置Log4j2 。我使用的代码如下: 注意 它扩展了默认情况下已经配置的控制台 它尝试向根记录器添加滚动文件追加器 我得到以下异常: 如果我在上面的代码之后注释掉该代码,它可以工作,但似乎缺少配置滚动文件附加程序的内容。我应该怎么做才能解决这个问题? 问题答案: 在 log4j 2.x中, 您必须以这种方式指定日期格式 标记格式的开始 表示它是日期格式

  • Im使用Log4j2 2.6.2。在应用程序的开始,我调用以下代码 输出显示为 即默认布局正在使用中。我对默认值的编程重写不起作用。有谁能帮你修改代码吗?

  • 问题内容: 我想以编程方式从应用程序中加载Log4j2 XML配置文件。 试过这个: 还有这个: 但是什么都没有。 问题答案: 自己找到答案。有人可能会觉得有用。