【问题标题】:How do I programmatically tell Logback to Reload Configuration如何以编程方式告诉 Logback 重新加载配置
【发布时间】:2012-03-08 08:58:06
【问题描述】:

我知道有一个 reloadDefaultConfiguration() jmx 操作,但是没有获取 MBean 的实例并调用此操作,是否有一个 Logback api 来重新加载默认配置(可选地指定日志配置文件路径)?

【问题讨论】:

    标签: java logging logback


    【解决方案1】:

    这是JMXConfigurator.reloadDefaultConfiguration()的源码:

    public void reloadDefaultConfiguration() throws JoranException {
      ContextInitializer ci = new ContextInitializer(loggerContext);
      URL url = ci.findURLOfDefaultConfigurationFile(true);
      loggerContext.reset();
      ci.configureByResource(url);
    }
    

    在需要的地方运行这段代码怎么样?

    唯一的问题是loggerContext 变量。您可以通过以下方式获得它:

    (LoggerContext)LoggerFactory.getILoggerFactory()
    

    不幸的是,看起来没有经过精心设计的 API 可以做到这一点,那么提出 issue 怎么样?另外你知道 Logback 有一个内置的自动刷新功能吗?

    【讨论】:

    • 是的,考虑过使用自动刷新功能,但在我的开发环境以外的任何地方启用它有点可怕
    【解决方案2】:

    为此我使用了以下代码:

    public static void reloadLogger() {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        ContextInitializer ci = new ContextInitializer(loggerContext);
        URL url = ci.findURLOfDefaultConfigurationFile(true);
    
        try {
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(loggerContext);
            loggerContext.reset();
            configurator.doConfigure(url);
        } catch (JoranException je) {
            // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
    }
    

    【讨论】:

    • 这不处理使用 .groovy 文件配置 logback ... throws org.xml.sax.SAXParseException
    • groovy 问题很烦人。我正在尝试在运行中重新启动我的系统,并且我想重新加载 groovy 文件,因为它将日志文件放入带时间戳的目录中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多