我們以編程方式配置Log4J2實現了自定義配置工廠: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的完整,而不是像這樣的代碼,我會認爲是黑客。
編輯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));
謝謝,看來現在工作。我還有其他問題,但我不相信它們與重新配置過程有關。我更新了主帖以反映代碼中的解決方案。 –