2010-10-01 7 views
5

मैं एक ऐसे एप्लिकेशन को लिख रहा हूं जिसमें कई मेवेन मॉड्यूल शामिल हैं। उन सभी को अपनी लॉग फाइलों में सामान लॉग करना होगा। मैंने प्रत्येक मॉड्यूल के मुख्य/संसाधन फ़ोल्डर में log4j.properties फ़ाइल बनाई है। अब जब मैं मॉड्यूल में से किसी एक से एप्लिकेशन शुरू करता हूं, तो यह सब कुछ उस मॉड्यूल की लॉग फ़ाइल में लिखता है। मुझे आश्चर्य हुआ कि यह इसलिए था क्योंकि यह उस स्टार्ट-मॉड्यूल से रूट-डीआईआर ले सकता था और लॉग फाइलों को सहेजने के लिए इस्तेमाल किया जाता था, लेकिन जब मैं केवल स्टार्ट-मॉड्यूल (log4j गुणों में श्रेणी का उपयोग करके) के लिए एक एपेंडर बनाता हूं और कोई रूट लॉगर यह मुझे अन्य मॉड्यूल में कक्षाओं के बारे में त्रुटि देता है जो उनके परिशिष्ट नहीं ढूंढ सकते हैं, जो इंगित करता है कि उन मॉड्यूल में से प्रत्येक में log4j.properties फ़ाइलों को नहीं मिला है या पढ़ा नहीं गया है। कोई भी विचार किसी भी विचार को हल करने के लिए और उन मॉड्यूल को उन गुण फ़ाइलों का उपयोग करने के लिए, या क्या मुझे सभी एपेंडर्स को एक बड़ी log4j.properties फ़ाइल में रखना होगा, जिससे सभी लॉग उस प्रारंभ-मॉड्यूल के रूट फ़ोल्डर में दिखाई दे सकते हैं उन अन्य मॉड्यूल के रूट फ़ोल्डर?लॉग 4j गुण

मुझे आशा है कि प्रश्न समझने के लिए पर्याप्त स्पष्ट है, अन्यथा विवरण मांगने के लिए स्वतंत्र महसूस करें।

+1

क्या आप अपने ऐप के बारे में अधिक जानकारी दे सकते हैं; उदाहरण के लिए यह एक वेब ऐप है? क्या यह एक ऐप सर्वर पर तैनात है? – Qwerky

+0

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

उत्तर

0

जहां तक ​​मुझे पता है कि केवल बुलाया मॉड्यूल की log4j.properties को डिफ़ॉल्ट रूप से पढ़ा और प्रारंभ किया जाता है।

यदि आप एक एकल स्टार्ट-मॉड्यूल से अलग मॉड्यूल का आह्वान करना चाहते हैं, तो आपको स्टार्ट-मॉड्यूल/src/main/संसाधन निर्देशिका में स्थित एक एकल log4j.properties फ़ाइल में अपने सभी एपेंडर्स जोड़ना होगा। यदि और जब आप चाहते हैं कि यह शायद एक वास्तुकला प्रश्न है।

बस एक सुझाव: यदि आप अब या भविष्य में अधिक उन्नत लॉगिंग नियंत्रण चाहते हैं तो एक्सएमएल-आधारित लॉगिंग पर स्विच करें।

0

यदि आप प्रत्येक अलग मॉड्यूल के src/main/संसाधनों में अलग log4j.properties शामिल करते हैं और उत्पन्न जेर फ़ाइलों को एक एकल क्लासलोडर में लोड करते हैं, तो केवल एक संसाधन लोड हो जाएगा क्योंकि log4j क्लासलोडर से गुण फ़ाइलों को लोड करता है (आपके संसाधन फ़ाइल नाम में ओवरलैप करते हैं)।

मैं में मेरी jar फ़ाइलों के में log4j.configuration फ़ाइलों को शामिल नहीं करता। दो कारणों से:

  • आपके मामले में काम नहीं करेगा।

  • log4j (लॉगर्स की संपादन क्रियाशीलता) को कॉन्फ़िगर करने के लिए, मुझे जार फ़ाइल खोलनी होगी और गुण फ़ाइल को संपादित करना होगा।

एक अलग समाधान बनाने के हो सकता है एक और एक छायांकित (http://maven.apache.org/plugins/maven-shade-plugin/) जार src/मुख्य/संसाधनों में एक भी log4j.properties सहित शेष मॉड्यूल, से फ़ाइल उत्पादन मॉड्यूल। फिर, यदि आपके पास अपनी पिछली परियोजनाओं को निर्भरताओं के रूप में उपभोग करने वाला एक और मॉड्यूल है, तो आप केवल छायांकित निर्भरता के रूप में शामिल हो सकते हैं।

हालांकि, यह एक समाधान है जिसका मैं उपयोग नहीं करता।

उम्मीद है कि मदद करता है।