Log4j2 - Reload Log4j configuration

在log4j 1.x時代,我們曾使用FileWatchdog去偵測log4j configuration發生改變時,能透過以下程式碼重新載入log設定,以讓我們能夠在系統runtime時debug:

LogManager.getLoggerRepository().resetConfiguration();
new PropertyConfigurator().doConfigure(filename, LogManager.getLoggerRepository());

log4j後,FileWatchdog不復存在,取而代之的是ConfigurationFileWatcher,這部分不在本篇文章涉略範圍;本篇文章要分享的是: 如何重新載入Log4j的設定檔。詳細程式碼可參考此連結

方法其實相當簡單,直接透過LoggerContext的setConfigLocation即會重新載入設定檔:

    @Test
    public void Should_SystemOutToConsole_When_LoadNewConfigFileForTestLogger2() {
        LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
        File file = new File(TEST_LOG_FILE);
        context.setConfigLocation(file.toURI());
 
        TestLogger2.debug("test debug");
        assertEquals(1, captor.getStandardOutput().size());
        assertTrue(captor.getStandardOutput().get(0).contains("test debug"));
    }

透過Configurator.reconfigure也可以達成相同目標,但要記得Configurator並非位於public api中,可能會有後續維護問題要考慮。