2011-12-29 11 views
18

उदाहरण में मैंने जो देखा है उससे वसंत pom.xml फाइलें यह है कि वे slf4j और log4j के लिए कुछ प्रविष्टियां जोड़ते हैं और किसी भी तरह जब आप अपने वसंत एप्लिकेशन में log4j का उपयोग करते हैं तो इसे slf4j लाइब्रेरी द्वारा लपेटा जाएगा।pm.xml wrap log4j में slf4j को कैसे जोड़ता है?

क्या कोई मुझे बता सकता है कि यह जादूगर कैसे होता है?

उत्तर

4

slf4j एक लॉगिंग एपीआई है, जो कुछ भी नहीं करता है, बस इंटरफेस का गुच्छा। log4j कंक्रीट कक्षाओं के साथ एक लॉगिंग सिस्टम है। वहाँ एक slf4j-log4j लाइब्रेरी है जो sl44 एपीआई के लिए बैकएंड के रूप में log4j का उपयोग करती है।

कुछ परियोजनाएं स्पष्ट रूप से log4j पर निर्भर करती हैं, वे ठोस वर्गों को कॉल करते हैं। इसलिए, आप अपनी परियोजना के लिए अन्य बैकएंड (उदा। लॉगबैक या जे.यू.एल. या अपाचे कॉमन्स या जो भी) का उपयोग नहीं कर सकते हैं, जिसे आपने बुद्धिमानी से केवल slf4j API का उपयोग करके बनाया है।

एक नकली कार्यान्वयन (पुल) द्वारा log4j कक्षाओं को प्रतिस्थापित करने के लिए a trick है जो बस सभी कॉल को sl4j पर रीडायरेक्ट करता है। मेवेन में आप केवल उच्च संस्करण संख्या के साथ एक निर्भरता घोषित करते हैं और यह नकली अल्ट्रा-आधुनिक log4j लाइब्रेरी के रूप में माना जाता है।

+0

तो रनटाइम पर यह निर्भरता इंजेक्शन का उपयोग करता है? अभी भी खेद है। – codecompleting

+0

नहीं, मेवेन ''। शायद मैं सवाल समझ में नहीं आता? क्या आप इसे स्पष्ट कर सकते हैं? – kan

27

Spring अभी भी सभी आंतरिक लॉगिंग (पिछड़ा संगतता) के लिए commons-logging का उपयोग करता है। यदि आप कुछ अन्य लॉगिंग फ्रेमवर्क (log4j) का उपयोग करना चाहते हैं तो आपको पुलcommons logging से कॉल के विकल्प के लिए कॉल करने की आवश्यकता है। अन्यथा आपको एकाधिक लॉगिंग कॉन्फ़िगरेशन बनाए रखना होगा।

विभिन्न प्रवेश चौखटे ( jul, log4j, jcl, logback) और आप तैनाती समय में वांछित प्रवेश ढांचे में प्लग करने के लिए अनुमति देता है के लिए एक सरल मुखौटा के रूप में

slf4j कार्य करता है।

इसके बजाय प्रवेश ढांचे कार्यान्वयन कि तीसरे पक्ष ढांचे आप slf4j's पुल कार्यान्वयन कि असली बात की तरह काम करता है, लेकिन वास्तव में सिर्फ slf4j या उसके ठोस बंधन के लिए लॉगिंग कॉल अग्रेषित प्रदान द्वारा लगाया गया है का उपयोग करने का

। Maven pom.xml की

लॉगिंग अनुभाग आम तौर पर इस तरह दिखता है:

<!-- remove the real commons-logging from classpath --> 
<!-- declare as provided or exclude from spring jars --> 
<dependency> 
    <artifactId>commons-logging</artifactId> 
    <groupId>commons-logging</groupId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

<!-- add slf4j interfaces to classpath --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.4</version> 
    <scope>compile</scope> 
</dependency> 

<!-- add commons logging to slf4j bridge to classpath --> 
<!-- acts as jcl but routes commons-logging calls to slf4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j binding to classpath --> 
<!-- routes slf4j calls to log4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j to classpath --> 
<!-- does the logging --> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 

यह वसंत कंटेनर और न ही निर्भरता इंजेक्शन के साथ कोई संबंध नहीं है, यह शुद्ध classpath, classloader सामान है ...

अधिक जानकारी के लिए कृपया thefollowing लिंक देखें।

+0

हालांकि यह उत्तर बहुत अच्छा है, इसमें एक गलतता है: एसएलएफ 4 जे * कॉमन्स लॉगिंग पर * ब्रिज * नहीं है, 'jcl-over-slf4j' निर्भरता * में कॉमन्स लॉगिंग API * का पुनर्मूल्यांकन शामिल है। यही कारण है कि यह सुनिश्चित करना महत्वपूर्ण है कि कॉमन्स लॉगिंग आपके क्लासपाथ पर नहीं है, क्योंकि दो मॉड्यूल एक ही पैकेज नाम (आवश्यकता के रूप में) का उपयोग करते हैं और इसलिए प्रत्येक विनाशकारी रूप से संघर्ष करते हैं। वसंत के "संदर्भ" मॉड्यूल में "स्प्रिंग-कोर" पर निर्भरता है जिसमें "कॉमन्स-लॉगिंग" पर निर्भरता शामिल है, यही कारण है कि आपको स्प्रिंग –

+0

का उपयोग करते समय इसे रोकने के लिए सक्रिय उपाय करना होगा, यह विशेष रूप से बहिष्कृत करने के लिए थोड़ा क्लीनर भी है स्प्रिंग में कॉमन्स-लॉगिंग पर निर्भरता, जो आप [इस लेख को स्प्रिंग की वेबसाइट पर] [https: // वसंत में वर्णित अनुसार कर सकते हैं।आईओ/ब्लॉग/200 9/12/04/लॉगिंग-निर्भरता-वसंत में), मैवेन को बताने के बजाए आपके पास पहले से ही आपके क्लासपाथ पर है (जो वास्तव में हैक का थोड़ा सा है)। –

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