2016-02-25 48 views
3

我們以編程方式配置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)); 

回答

1

如果你想有一個完整的重新配置,然後使用您的配置工廠來創建一個新的。然後使用Configurator類來替換LoggerContext上的配置或調用setConfiguration。

+0

謝謝,看來現在工作。我還有其他問題,但我不相信它們與重新配置過程有關。我更新了主帖以反映代碼中的解決方案。 –