2014-01-13 102 views
19

我想從我的應用程序以編程方式加載Log4j2 XML配置文件。以編程方式加載Log4j2配置文件

嘗試這樣:

ConfigurationSource source = new ConfigurationSource(); 
source.setLocation(logConfigurationFile); 
Configurator.initialize(null, source); 

這:

ConfigurationSource source = new ConfigurationSource(); 
source.setLocation(logConfigurationFile); 
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source); 
ConfigurationFactory.setConfigurationFactory(factory); 

但沒有什麼作品呢。

+0

與被引入到配置在log4j2重裝它將使意義指定log4j2 API和你正在使用的核心是哪個版本? –

回答

10

我自己找到了答案。有人可能會覺得它有用。

ConfigurationSource source = new ConfigurationSource(); 
source.setLocation(logConfigurationFile); 
source.setFile(new File(logConfigurationFile)); 
source.setInputStream(new FileInputStream(logConfigurationFile)); 
Configurator.initialize(null, source); 
+0

我試圖做同樣的事情全部向後兼容的變化,但即使使用上面的代碼,也是失敗的。您的項目中是否有log4j2 Web依賴項?我的log4j2.xml在類路徑之外,我試圖將它加載到具有@PostConstruct方法的Spring bean中。 – ColinMc

+0

我的日誌xml配置文件位於類路徑之外。 – HashimR

+0

你的應用程序是一個網絡應用程序嗎?我應該提到我也使用slf4j來抽象log4j2。 – ColinMc

11

如果您有一個主入口點,則此代碼段可能會爲您節省一些麻煩。設置屬性調用必須在任何記錄器創建之前觸發。這種方法適用於類路徑中的文件。

public class TestProcess { 
    static { 
     System.setProperty("log4j.configurationFile", "log4j-alternate.xml"); 
    } 

    private static final Logger log = LoggerFactory.getLogger(TestProcess.class); 

} 
+0

這工作很好,我試圖設置構造函數的屬性,但它沒有工作。靜態塊解決了。 – another

22

對於log4j的最新版本,這裏是應該加載外部log4j2.xml工作:

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml"; 
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile)); 
Configurator.initialize(null, source); 
+9

你應該只能使用'Configurator.initialize(null,「fileName」);' –

+1

是的@Conor是正確的。謝謝! –

1

如果您使用的是的Servlet 3.0 Web應用程序可以使用Log4jServletContextListener並執行以下操作:

編寫自定義LogContextListener,它從Log4jServletContextListener延伸,將其設置在您的[R web.xml,關閉自動初始化:

<listener> 
    <listener-class>com.example.LogContextListener</listener-class> 
</listener> 
<context-param> 
    <param-name>isLog4jAutoInitializationDisabled</param-name> 
    <param-value>true</param-value> 
</context-param> 

在您的自定義LogContextListener覆蓋contextInitialized並設置配置文件位置

public void contextInitialized(ServletContextEvent event) { 
    /* Some logic to calculate where the config file is saved. For 
    * example you can read an environment variable. 
    */ 
    String pathToConfigFile = ... + "/log4j2.xml"; 
    Configurator.initialize(null, pathToConfigFile); 
    super.contextInitialized(event); 
} 

了在web.xml直接配置位置的優點是 你可以計算路徑基於一些額外的信息並訪問log4j2.xml,即使它在你的類路徑之外。

0
final URL log4j = Resources.getResource("log4j2-test.xml"); 
LoggerContext.getContext(false) 
    .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(), 
    log4j))); 
+0

這個只是一個參考 - 小心使用「log4j2-test.xml」進行測試。如果這是在任何文件夾中,log4j2會檢查它是否會將其用於「log4j2.xml」,並讓您認爲您的重寫工作正常,但實際上沒有。我還沒有試過你的代碼,但是我有一個前面的代碼片段的問題。我使用的是「log4j2-test.xml」,認爲在運行時所有內容都是重寫的,只是發現它是重寫的,因爲log4j2首先查找「log4j2-test.xml」,然後查找「log4j2.xml」https:// logging。 apache.org/log4j/2.0/manual/configuration.html#AutomaticConfiguration – adpro

相關問題