2011-05-25 17 views
6

कॉन्फ़िगर करने के लिए स्प्रिंग प्रोजेक्ट में गुणों का उपयोग कैसे करें मेरे स्प्रिंग प्रोजेक्ट में मेरे पास एकाधिक गुण फ़ाइलें हैं। वसंत संदर्भ इन गुणों को लोड करता है और सुविधाजनक तरीके से ओवरराइडिंग संपत्ति को संभालता है। क्या मेरे स्प्रिंग कॉन्फ़िगरेशन एक्सएमएल फाइलों (यानी ${myprop}) में उपलब्ध गुणों को लेने का कोई तरीका है और उन्हें log4j.xml फ़ाइल में समान रूप से उपयोग करें? मुझे पता है कि मैं स्टार्टअप पर -Dprop=value का उपयोग कर log4j पर सिस्टम गुणों को पास कर सकता हूं, लेकिन मैं अपनी प्रोजेक्ट में प्रॉपर्टी फ़ाइलों में सभी कॉन्फ़िगरेशन को प्राथमिकता देना पसंद करूंगा। क्या यह संभव है?log4j.xml

मेरा ऐप टॉमकैट में चलता है।

+0

मुझे नहीं लगता कि आप यह कर सकते हैं - log4j इस प्रकार का आत्मनिरीक्षण प्रदान नहीं करता है। – skaffman

+0

भले ही यह संभव हो, आप संभावित रूप से कुछ लॉगिंग याद करेंगे क्योंकि संदर्भ शुरू करने और गुणों को लोड करते समय स्प्रिंग स्वयं log4j पर लॉग ऑन होगा। – AngerClown

उत्तर

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

यह एक वैध समाधान की तरह दिखता है। दुर्भाग्यवश, क्योंकि मैं स्प्रिंग वेब कंटेनर में काम कर रहा हूं, इसलिए मुझे यह कोड तब तक निष्पादित नहीं किया जा सकता जब तक कि अधिकांश संदर्भ पहले ही लोड नहीं हो जाते हैं। इसका मतलब है कि बहुत सारे प्रारंभिक लॉगिंग होंगे जो मेरे नए लॉग स्थान पर नहीं जाएंगी (मेरी गुण फ़ाइल द्वारा परिभाषित)। मुझे एक ऐप लॉगिंग को कई स्थानों पर लॉगिंग करने का विचार पसंद नहीं है, इसलिए मुझे लगता है कि मैं संपत्ति फ़ाइलों के माध्यम से स्थान को अधिक लचीला बनाने की मेरी आशा पर छोड़ दूंगा। आपके उत्तर के लिए धन्यवाद। मुझे यकीन है कि इस कोड स्निपेट से कोई फायदा होगा। – anschoewe

0

मुझे लगता है कि आप Log4J के साथ बातचीत कर सकते हैं एकमात्र तरीका Nested diagnostic context के माध्यम से है।

तो यदि आप बहुत हताश हैं, तो आप एक स्प्रिंग एओपी पहलू लिख सकते हैं जो आपके वसंत बीन लॉग के लिए नैदानिक ​​संदर्भ सेट करता है (और आप वहां गुणों का उपयोग कर सकते हैं)। हालांकि, यह आवश्यक होगा कि लॉग स्प्रिंग बीन के लिए उपलब्ध हो, इसलिए आपको अपनी सेवा इंटरफेस में getLog() विधि जोड़ने की आवश्यकता होगी (यदि आप स्थिर AspectJ संकलन का उपयोग करते हैं और AspectJ in Action में वर्णित है तो यह बहुत आसान हो जाता है)।

लेकिन एओपी का उपयोग करने से कम, मैं स्प्रिंग और लॉग 4 जे पर बातचीत करने के लिए एक समझदार तरीका नहीं सोच सकता।

+0

आपके विचारों के लिए धन्यवाद। आपने जो कहा है, उससे मेरा एक प्रश्न है: क्या log4j.xml फ़ाइल बाहरी गुण फ़ाइल का उपयोग करना संभव है-तो कुछ सेटिंग्स xml फ़ाइल में हार्ड-कोडेड हैं? – anschoewe

+1

मैवेन या चींटी के साथ संसाधन फ़िल्टरिंग का उपयोग करने के बारे में कैसे? –

संबंधित मुद्दे