2011-05-25 16 views
6

Yay projemde birden fazla özellik dosyası var. Yay içeriği bu özellikleri yükler ve mülkü uygun bir şekilde geçersiz kılar. Benim Spring yapılandırma XML dosyaları (yani. ${myprop}) için kullanılabilir özellikleri almak ve log4j.xml dosyamda benzer bir şekilde kullanmak için bir yolu var mı? Başlangıçta -Dprop=value kullanarak sistem özelliklerini log4j'ye geçirebileceğimi biliyorum, ancak projemin özellik dosyalarındaki tüm yapılandırmaların olmasını tercih ediyorum. Mümkün mü?Log4j.xml dosyasını yapılandırmak için bir Spring projesindeki özellikler nasıl kullanılır?

Uygulamam Tomcat'te çalışır.

+0

Bunu yapabileceğinizi sanmıyorum - log4j bu tür bir iç gözlem sağlamaz. – skaffman

+0

Bu mümkün olsa bile, bazı günlüğe kaydetme olasılığını muhtemelen kaybedersiniz, çünkü bağlamı başlatırken ve özellikleri yüklerken Spring'in kendisi log4j'ye giriş yapar. – AngerClown

cevap

1

Birden çok özellik dosyasını bir Properties'e ekledikten sonra bu sınıfı kullanmayı deneyin.

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

Geçerli bir çözüm gibi görünüyor. Ne yazık ki, bir Spring web kapsayıcısında çalışıyorum, bağlamın çoktan yüklenmesine kadar bu kodu çalıştırılamıyorum. Bu, yeni kayıt konumuma (özellikler dosyam tarafından tanımlanır) gitmeyecek pek çok başlangıç ​​günlüğü olacağı anlamına gelir. Birden fazla konuma giriş yapan bir uygulama fikri hoşuma gitmiyor, bu yüzden mülk dosyalarının yerini daha esnek bir hale getirme umudumdan vazgeçeceğim. Cevabınız için teşekkürler. Eminim birisi bu kod snippet'inden yararlanabilir. – anschoewe

0

Log4J ile etkileşime girebilmenin tek yolu Nested diagnostic context.

Çok çaresizseniz, Spring Bean günlükleriniz için tanılama bağlamını belirleyen bir Spring AOP yönü yazabilirsiniz (ve buradaki özellikleri kullanabilirsiniz). Ancak bu, Logonun Spring Bean için kullanılabilir olmasını gerektirecektir, bu yüzden servis arayüzlerinize bir getLog() yöntemi eklemeniz gerekecektir (bu, static AspectJ derlemesini kullanırsanız ve AspectJ in Action'da açıklanırsa çok daha kolaylaşır).

Ancak AOP'yi kullanmanın kısa bir yolu, Spring ve Log4J'nin etkileşimde bulunmasına izin vermenin mantıklı bir yolunu düşünemiyorum.

+0

Düşünceleriniz için teşekkürler. Söylediklerinize göre, şu sorularım var: Bir log4j.xml dosyasının harici bir özellik dosyası kullanması mümkün mü? Bazı ayarlar xml dosyasında kodlanmış mı? – anschoewe

+1

Kaynak filtrelemeyi maven veya karınca ile kullanmaya ne dersiniz? –

İlgili konular