2011-05-25 95 views
6

我的Spring項目中有多個屬性文件。 Spring上下文加載這些屬性並以便捷的方式處理屬性覆蓋。有沒有辦法讓我的Spring配置XML文件(即${myprop})可用的​​屬性在我的log4j.xml文件中以類似的方式使用它們?我知道我可以在啓動時使用-Dprop=value將系統屬性傳遞給log4j,但我希望在我的項目中擁有屬性文件中的所有配置。這可能嗎?如何在Spring項目中使用屬性來配置log4j.xml

我的應用程序在Tomcat中運行。

+0

我不認爲你可以做到這一點 - log4j不提供這種反思。 – skaffman 2011-05-25 16:50:21

+0

即使這可能,您也可能會錯過某些日誌記錄,因爲在啓動上下文並加載屬性時,Spring本身會記錄到log4j。 – AngerClown 2011-05-25 19:13:57

回答

1

嘗試使用此類,將多個屬性文件集成到一個屬性後。

public class DOMConfiguratorWithProperties extends DOMConfigurator { 

    private Properties propertiesField = null; 

    public synchronized Properties getProperties() { 
     return propertiesField; 
    } 

    public synchronized void setProperties(final Properties properties) { 
     propertiesField = properties; 
    } 

    @Override 
    protected String subst(final String value) { 
     return super.subst(value, getProperties()); 
    } 

    public static void configure(final String filename) { 
     new DOMConfiguratorWithProperties().doConfigure(
       filename, 
       LogManager.getLoggerRepository()); 
    } 

    public static void configure(
      final String filename, 
      final Properties properties) { 
     DOMConfiguratorWithProperties configurator = new DOMConfiguratorWithProperties(); 
     configurator.setProperties(properties); 
     configurator.doConfigure(
       filename, 
       LogManager.getLoggerRepository()); 
    } 
} 
+0

這看起來像一個有效的解決方案。不幸的是,因爲我在Spring Web容器中工作,所以我無法獲取該代碼,直到大部分上下文已經加載完畢。這意味着將有很多初始日誌記錄不會進入我的新日誌位置(由我的屬性文件定義)。我不喜歡將應用程序記錄到多個位置的想法,因此我想我會放棄希望通過屬性文件使記錄的位置更加靈活。感謝您的回答。我相信有人會從這段代碼中受益。 – anschoewe 2011-05-26 21:01:59

0

我認爲您可以與Log4J交互的唯一方式是通過Nested diagnostic context。因此,如果你非常絕望,你可以編寫一個Spring AOP方面來爲你的Spring Bean日誌設置診斷上下文(你可以使用那裏的屬性)。但是,這需要Spring可以使用Log,因此您需要在服務接口中添加getLog()方法(如果使用靜態AspectJ編譯,這會變得更容易,並在AspectJ in Action中進行了描述)。但是使用AOP的缺點,我想不出讓Spring和Log4J交互的明智方式。

+0

感謝您的想法。從你所說的話,我有一個後續問題:可能有一個log4j.xml文件使用外部屬性文件 - 所以一些設置是在xml文件中硬編碼? – anschoewe 2011-05-25 17:35:31

+1

如何使用maven或ant進行資源過濾? – 2011-05-25 20:36:41

相關問題