【问题标题】:Reload log4j2 configuration on demand按需重新加载 log4j2 配置
【发布时间】:2015-03-28 18:33:09
【问题描述】:

我将 log4j2.xml 配置文件设置为每 30 秒检查一次:

<Configuration status="WARN" monitorInterval="30">
    ...
</Configuration>

是否可以以编程方式告诉 log4j2 检查配置中的更改而不是超时?

NB我不想以编程方式加载指定配置文件的配置,我只想告诉log4j2检查之前已经加载的配置文件,好像monitorInterval过期了。 p>

谢谢!

【问题讨论】:

标签: java logging configuration log4j log4j2


【解决方案1】:

看来我找到了解决办法:

((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).reconfigure();

有没有人看到这有什么错误/副作用?

【讨论】:

  • 不幸的是,当有多个日志记录上下文时,例如在 OSGI 或 Web 应用程序中,我发现这个问题。在这种情况下,上面的代码仅在其中一个上下文中重新加载配置
  • @plinyar OSGI/web-apps 环境的解决方案是什么?
  • 抱歉,@gaurav,已经不记得了。最后我更喜欢 LogBack
【解决方案2】:

目前没有干净的方法可以做到这一点。 它可以通过反射来完成。 (当然,如果实现发生变化,这可能会中断。)

更新:这是错误的。 有一个干净的方法,请参阅下面 jamp 的答案。

org.apache.logging.log4j.core.LoggerContext ctx = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);

org.apache.logging.log4j.core.config.FileConfigurationMonitor mon = (org.apache.logging.log4j.core.config.FileConfigurationMonitor) ctx.getConfiguration().getConfigurationMonitor();

// use reflection to get monitor's "nextCheck" field.
// set field accessible
// set field value to zero

mon.checkConfiguration();

【讨论】:

  • 哦。没有 API 可以做你想做的事。老实说,我相信反射是 log4j-2.1 的唯一选择。您当然可以在 Jira 问题跟踪器上提出功能请求。
  • 看来你是对的......找不到任何东西...... :(非常遗憾,我会接受它;)
  • 我收回它...我可能已经找到了解决方案...我将其发布为答案
【解决方案3】:

使用org.apache.logging.log4j.core.config.Configurator 怎么样?

   LoggerContext loggerContext = LoggerContext.getContext(false);
   final Configuration configuration = loggerContext.getConfiguration();
   Configurator.reconfigure(configuration);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2017-08-07
    • 1970-01-01
    • 2016-09-20
    • 2020-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多