簡體   English   中英

Log4J2程序化重新配置

[英]Log4J2 Programmatic Reconfiguration

我們已經實現了一個自定義配置工廠,以便以編程方式配置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,而不是像我這樣的代碼,我認為是一個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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM