2010-01-21 14 views
15

हाइबरनेट जब मेरी स्प्रिंग/हाइबरनेट आवेदन की तैनाती, मैं प्रवेश से संबंधित निम्न चेतावनी मिल:वसंत के साथ जावा लॉगिंग सिस्टम द्वारा baffled और

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
log4j:WARN Please initialize the log4j system properly. 

मेरे लिए आश्चर्यजनक से Google अतः खोज/जानकारी की कमी थी । प्रासंगिक एकमात्र चीज यह एसओ पोस्ट Problem with Commons Logging/Log4j setup in spring webapp with tomcat 6

हालांकि, यह मेरे बाहर भी है। क्या कोई यहां लॉगिंग सिस्टम को यहां खेल सकता है, या मुझे इस मामले पर एक वास्तविक संसाधन के लिए इंगित कर सकता है (कुछ प्राचीन Google खोज परिणाम हैं जो वास्तव में लागू नहीं होते हैं)। विशेष रूप से, मुद्दों मैं कुश्ती कर रहा हूँ कर रहे हैं:

  • बीच कॉमन्स-प्रवेश, log4j, slf4j और JCL भेद। मेरी समझ यह है कि slf4j एक रैपर है, जबकि कॉमन्स-लॉगिंग और log4j वास्तविक कार्यान्वयन हैं। मुझे नहीं पता कि जेसीएल कहाँ फिट बैठता है।

  • वसंत के लिए लॉगिंग को कॉन्फ़िगर कैसे करें। Web.xml फ़ाइल में क्या करता है, क्या मुझे log4j.properties फ़ाइल या log4j.xml फ़ाइल चाहिए? वेब-आईएनएफ में यह कहां जाता है? क्या मेरे अनुप्रयोग Context.xml फ़ाइल में कुछ भी जाता है? (क्षमा करें, लेकिन मुझे शून्य से शुरू करने की आवश्यकता है)।

  • मैं अपने प्रोजेक्ट में हाइबरनेट का उपयोग कर रहा हूं और मेवेन के माध्यम से भी शामिल हूं। ऐसा लगता है कि हाइबरनेट स्लैफ 4 जे-सरल का उपयोग करता है। मैंने चेतावनियां देखी हैं कि मुझे क्लासपाथ पर slf4j-simple और slf4j-log4j नहीं हो सकता है। मैंने slf4j-log4j को निर्भरता के रूप में शामिल नहीं किया है, लेकिन हाइबरनेट को इसमें शामिल होना चाहिए। मैं इस समस्या का समाधान कैसे कर सकता हूं? क्या मैं इसके बजाय log4j का उपयोग करने के लिए हाइबरनेट को मजबूर कर सकता हूं?

किसी भी मदद की सराहना की जाएगी। धन्यवाद।


संपादित करें:

सभी जवाब अब तक के लिए धन्यवाद। मैं इन सुझावों को आज़मा रहा हूं। वसंत वेब-ऐप के बारे में विशेष रूप से क्या? मैंने श्रोताओं और पैरामीटर के उदाहरण देखे हैं और web.xml फ़ाइल में क्या नहीं रखा है। क्या यह भी आवश्यक है?

उत्तर

12
  • commons-logging और SLF4J दोनों कर रहे हैं अन्य लॉगिंग कार्यान्वयन के आसपास एपीआई रैपर। एसएलएफ 4 जे दोनों का अधिक आधुनिक है, और अधिक सक्षम है। Log4j एक लॉगिंग कार्यान्वयन है, और काफी डिफैक्टो मानक है। JUL (java.util.logging के लिए छोटा) जेआरई के साथ आता है (आमतौर पर भयानक) लॉगिंग कार्यान्वयन है। एक और लॉग कार्यान्वयन logback है, जो धीरे-धीरे कर्षण प्राप्त कर रहा है, लेकिन अभी तक व्यापक रूप से नहीं है।
  • log4j.properties और log4j.xml log4j को कॉन्फ़िगर करने के विभिन्न तरीके हैं, दोनों समान रूप से मान्य हैं। आप जो भी उपयोग करते हैं वह आपके ऊपर है, हालांकि कुछ एप्लिकेशन सर्वर एक या दूसरे को निर्देशित करते हैं। इसे कॉन्फ़िगर करने के तरीके को जानने के लिए log4j manual पढ़ें।
  • यदि हाइबरनेट अपने एपीआई के रूप में एसएलएफ 4 जे का उपयोग करता है, तो यह हाइबरनेट डेवलपर्स की पसंद है। हालांकि, आप चुन सकते हैं कि कौन सा लॉगिंग कार्यान्वयन एसएलएफ 4 जे प्रतिनिधि करेगा। फिर से, अपने चुने हुए कार्यान्वयन का चयन कैसे करें, यह जानने के लिए slf4j manual पढ़ें।

हां, यह सब भ्रमित है। एक खुली पसंद को देखते हुए, एसएलएफ 4 जे और लॉगबैक सबसे सक्षम संयोजन है, लेकिन आपको आमतौर पर खुली पसंद नहीं मिलती है। अलग-अलग ढांचे (जैसे हाइबरनेट और स्प्रिंग) संभावित रूप से विभिन्न लॉगिंग एपीआई, आम तौर पर कॉमन्स-लॉगिंग या एसएलएफ 4 जे का उपयोग करेंगे, लेकिन आप उन सभी एपीआई को अंततः उसी अंतर्निहित कार्यान्वयन (आमतौर पर लॉग 4j) पर लॉग इन कर सकते हैं।

+0

उत्कृष्ट उत्तर skaffman – underdog

2

आपको अपने क्लासपाथ में log4j.properties फ़ाइल की आवश्यकता है। यहाँ एक न्यूनतम गुण फ़ाइल है मैं कल बनाया है क्या हुआ:

log4j.logger.BillReview=INFO,BillReviewLog 
log4j.appender.BillReviewLog=org.apache.log4j.RollingFileAppender 
log4j.appender.BillReviewLog.File=BillReview.log 
log4j.appender.BillReviewLog.Append=true 
log4j.appender.BillReviewLog.MaxFileSize=5000KB 
log4j.appender.BillReviewLog.MaxBackupIndex=5 
log4j.appender.BillReviewLog.layout=org.apache.log4j.PatternLayout 
log4j.appender.BillReviewLog.layout.ConversionPattern=%c %p %-10.10X{server} %-4.4X{user} %d{ISO8601} %m%n 

रखो कि एक log4j.properties फ़ाइल में, अपनी परियोजना की तरह कुछ और करने के लिए 'BillReview' के सभी संदर्भ बदल सकते हैं और है कि एक के लिए प्रवेश करेंगे फ़ाइल और उन संदेशों को रोको।

लॉगिंग ढांचे के बारे में आपके प्रश्न काफी हद तक व्यक्तिगत पसंद हैं। Log4j पुराना मानक है और यह ठीक काम करता है, कॉमन्स लॉगिंग और slf4j नए एपीआई हैं और कुछ और जटिल उपयोग मामलों की अनुमति देते हैं।

1

मैं पहली बुलेट का जवाब देने से कुछ और अनुभवी गुरुओं को दूंगा।

अपने दूसरे बुलेट का जवाब ...

आप या तो एक log4j.properties या log4j.xml फ़ाइल का उपयोग कर सकते हैं (यह कोई बात नहीं है)। जो कुछ भी आप चुनते हैं उसे आपको अपने क्लासपाथ में जोड़ना चाहिए (आमतौर पर इसे आपके स्रोत कोड के समान निर्देशिका में जाना चाहिए)। यदि आप वसंत का उपयोग कर रहे हैं, तो तार्किक भागों में अपनी src निर्देशिका को तोड़ने का एक अच्छा तरीका निम्न निर्देशिका संरचना का उपयोग कर रहा है ...

src/मुख्य/जावा - मुख्य स्रोत यहाँ
src/मुख्य/संसाधनों डाल - मुख्य स्रोत यहाँ
src/परीक्षण/जावा आप द्वारा इस्तेमाल किया डाल संसाधनों - डाल परीक्षण स्रोत यहाँ (परीक्षण के लिए)
src/test/संसाधन - यहां परीक्षणों के लिए संसाधन डालें

इसलिए आप src /j /properties को src/test/resource निर्देशिका में डाल देंगे।

अपने तीसरे गोली का जवाब ...

आप आप में एक निर्भरता के भीतर एक निर्भरता बाहर कर सकते हैं निम्न कार्य करके फ़ाइल pom.xml ...

<dependency> 
    <groupId>org.apache.xbean</groupId> 
    <artifactId>xbean-spring</artifactId> 
    <version>${xbean.version}</version> 
    <exclusions> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
4
  • बीच कॉमन्स-प्रवेश, log4j, slf4j और JCL भेद। मेरी समझ यह है कि slf4j एक रैपर है, जबकि कॉमन्स-लॉगिंग और log4j वास्तविक कार्यान्वयन हैं। मैं नहीं पता है जहां JCL में फिट बैठता है।

जकार्ता कॉमन्स लॉगिंग (JCL) और जावा SLF4J के लिए सरल लॉगिंग फसाड दोनों कपोल-कल्पना कर रहे हैं विभिन्न प्रवेश चौखटे उदा के लिए java.util.logging, log4j और लॉगबैक, अंतिम उपयोगकर्ता को परिनियोजन समय पर इच्छित लॉगिंग फ्रेमवर्क में प्लग करने की इजाजत देता है। कॉमन्स लॉगिंग क्लास लोडर समस्याओं से ग्रस्त होने के लिए जाना जाता है जो एसएलएफ 4 जे हल करने की कोशिश करता है (एसएलएफ 4 जे क्लीनर लाइब्रेरी के रूप में जाना जाता है)।

ही कहा है, तथ्य यह है कि वसंत जकार्ता कॉमन्स लॉगिंग API का उपयोग करता है (Logging Dependencies in Spring देखें): वसंत JCL के खिलाफ संकलित किया गया है और स्प्रिंग JCL Log वस्तुओं कक्षाएं कि वसंत का विस्तार के लिए उपलब्ध बनाता है। वास्तव में वसंत में बाहरी निर्भरता केवल अनिवार्य बाहरी निर्भरता है।यह विकल्प has been made क्योंकि कई अन्य ढांचे जहां भी इसका उपयोग कर रहे हैं (उदा। स्ट्रेट्स)। विचार था कि अनुप्रयोगों के निर्माण के दौरान वर्ग पथ पर कई मुखौटा पुस्तकालयों से बचने के लिए (स्प्रिंग के लिए "ए", स्ट्रेट्स के लिए "बी" इत्यादि)। हालांकि यह संभव है एसएलएफ 4 जे द्वारा जेसीएल को प्रतिस्थापित करने के लिए यदि आप चाहते हैं (एसएफएल 4 जे ढांचे को लॉगिंग करने के लिए बाइंडिंग प्रदान करता है लेकिन "जेसीएल से एसएलएफ 4 जे" पुल भी प्रदान करता है)। सभी विवरणों के लिए उल्लिखित पोस्ट Logging Dependencies in Spring देखें।

  • कैसे स्प्रिंग के लिए लॉगिंग कॉन्फ़िगर करने के लिए। Web.xml फ़ाइल में क्या करता है, क्या मुझे log4j.properties फ़ाइल या log4j.xml फ़ाइल चाहिए? वेब-आईएनएफ में यह कहां जाता है? क्या मेरे अनुप्रयोग Context.xml फ़ाइल में कुछ भी जाता है? (क्षमा करें, लेकिन मुझे शून्य से शुरू करने की आवश्यकता है)।

लॉग ऑन करने के लिए, आप 1. जो कार्यान्वयन आप उपयोग करना (java.util.logging, log4j या logback), 2. अगर (जावा की आवश्यकता classpath पर चुना एक रखना चाहते हैं तय करने के लिए किया है। util.logging जावा एसई में है इसलिए इसे अतिरिक्त पुस्तकालयों की आवश्यकता नहीं है) और 3. इसे कॉन्फ़िगर करने के लिए (क्लासपाथ पर कॉन्फ़िगरेशन फ़ाइल डालकर)। यदि आप log4j का उपयोग करना चुनते हैं, तो बस अपने जार और log4j.properties या अधिक फैंसी (लेकिन अधिक वर्बोज़) log4j.xml (कॉन्फ़िगरेशन के लिए यह एक और प्रारूप है) को क्लासपाथ में जोड़ें।

  • मैं अपने प्रोजेक्ट में हाइबरनेट उपयोग कर रहा हूँ और Maven के माध्यम से शामिल है। ऐसा लगता है कि हाइबरनेट स्लैफ 4 जे-सरल का उपयोग करता है। मैंने चेतावनियां देखी हैं कि मुझे क्लासपाथ पर slf4j-simple और slf4j-log4j नहीं हो सकता है। मैंने slf4j-log4j को निर्भरता के रूप में शामिल नहीं किया है, लेकिन हाइबरनेट को इसमें शामिल होना चाहिए। मैं इस समस्या का समाधान कैसे कर सकता हूं? क्या मैं इसके बजाय log4j का उपयोग करने के लिए हाइबरनेट को मजबूर कर सकता हूं?

Hibernate utilizes Simple Logging Facade for Java (SLF4J) और, वास्तव में, आप कई bindings (जैसे slf4j-simple.jar और slf4j-logj12.jar) एक ही समय में classpath पर नहीं हो सकता। यहां, आपको slf4j-simple.jar अन्य निर्भरता से पारगमन से प्राप्त होने की संभावना है। इस समस्या को हल करने के लिए, mvn dependency:tree चलाएं ताकि यह पता चल सके कि यह कहां से आ रहा है और यदि आवश्यक हो तो इसे बाहर कर दें।

और वैसे, आपके मामले में, मैं स्प्रिंग को एसएलएफ 4 जे का उपयोग करने के लिए कॉन्फ़िगर करता हूं क्योंकि हाइबरनेट इसका उपयोग कर रहा है। उसके लिए पहले पैराग्राफ में उल्लिखित लिंक में चरणों का पालन करें। और मैं लॉगबैक का उपयोग लॉगिंग फ्रेमवर्क (जो log4j के उत्तराधिकारी) के रूप में करता हूं, यह वह जगह है जहां चीजें होती हैं।

0

मेरे परीक्षण चलाने के दौरान मुझे उसी क्षेत्र में समस्याएं थीं। अंततः मैंने देखा कि slf4j-log4j12 के अलावा जूनिट slf4j-nop पर निर्भरता के रूप में ला रहा था। एक बार जब मैंने slf4j-nop को छोड़ दिया, तो यह काम करना शुरू कर दिया।

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