जावा लॉगिंग फ्रेमवर्क

जावा लॉगिंग फ्रेमवर्क जावा मंच  के लिए एक कंप्यूटर डेटा लॉगिंग पैकेज है। यह लेख सामान्य उद्देश्य लॉगिंग फ्रेमवर्क को कवर करता है।

लॉगिंग एक एप्लिकेशन द्वारा गतिविधि की रिकॉर्डिंग को संदर्भित करता है और विकास टीमों के लिए एक सामान्य समस्या है। लॉगिंग फ्रेमवर्क जावा प्लेटफॉर्म के लिए लॉगिंग की प्रक्रिया को आसान और मानकीकृत करता है। विशेष रूप से वे कंसोल को स्पष्ट आउटपुट से बचकर लचीलापन प्रदान करते हैं (नीचे परिशिष्ट देखें)। जहाँ लॉग लिखे जाते हैं वे कोड से स्वतंत्र हो जाते हैं और रनटाइम पर अनुकूलित किए जा सकते हैं।

दुर्भाग्य से जावा विकास किट  में इसके मूल रिलीज़ में लॉगिंग शामिल नहीं थी इसलिए जब तक जावा लॉगिंग एपीआई को जोड़ा गया तब तक कई अन्य लॉगिंग फ्रेमवर्क व्यापक रूप से उपयोग किए जा चुके थे - विशेष रूप से Apache Commons Logging (जावा कॉमन्स लॉगिंग या जेसीएल के रूप में भी जाना जाता है) और Log4j. इसके कारण अलग-अलग लॉगिंग फ्रेमवर्क का उपयोग करते हुए प्रत्येक अलग-अलग तृतीय-पक्ष पुस्तकालयों (JARs) को एकीकृत करते समय समस्याएँ हुईं। इस समस्या को हल करने के लिए प्लग करने योग्य लॉगिंग फ्रेमवर्क (रैपर) विकसित किए गए थे।

कार्यक्षमता सिंहावलोकन
लॉगिंग को आमतौर पर तीन प्रमुख टुकड़ों में विभाजित किया जाता है: लॉगर, फॉर्मेटर और एपेंडर (या हैंडलर)।


 * लकड़हारे कुछ मेटाडेटा के साथ लॉग किए जाने वाले संदेश को कैप्चर करने और इसे लॉगिंग फ्रेमवर्क में पास करने के लिए ज़िम्मेदार है।
 * संदेश प्राप्त करने के बाद, फ्रेमवर्क फॉर्मेटर को संदेश के साथ कॉल करता है जो इसे आउटपुट के लिए प्रारूपित करता है।
 * ढांचा तब स्वरूपित संदेश को उपयुक्त परिशिष्ट/हैंडलर को स्वभाव के लिए सौंप देता है। इसमें कंसोल डिस्प्ले में आउटपुट, डिस्क पर लिखना, डेटाबेस में जोड़ना, या ईमेल बनाना शामिल हो सकता है।

|Java Logging Framework by the Object Guy जैसे सरल लॉगिंग फ्रेमवर्क, लॉगर और एपेंडर को जोड़ते हैं। यह डिफ़ॉल्ट संचालन को सरल करता है, लेकिन यह कम विन्यास योग्य है, खासकर अगर परियोजना को वातावरण में ले जाया जाता है।

लकड़हारा
एक लकड़हारा एक वस्तु है जो एप्लिकेशन को आउटपुट भेजने / संग्रहीत करने के संबंध में बिना लॉग इन करने की अनुमति देता है। एप्लिकेशन किसी दिए गए नाम/पहचानकर्ता के तहत लॉगर ऑब्जेक्ट को वैकल्पिक गंभीरता स्तर के साथ ऑब्जेक्ट या ऑब्जेक्ट और अपवाद हैंडलिंग पास करके संदेश लॉग करता है।

नाम
लकड़हारे का एक नाम होता है। नाम आमतौर पर स्तरों को अलग करने वाली अवधि (।) के साथ पदानुक्रमित रूप से संरचित होता है। लॉगिंग करने वाले वर्ग या पैकेज के नाम का उपयोग करने के लिए एक सामान्य योजना है। Log4j और Java लॉगिंग API दोनों ही पदानुक्रम को उच्चतर परिभाषित करने वाले संचालकों का समर्थन करते हैं।

उदाहरण के लिए, लकड़हारे का नाम हो सकता है. निम्नलिखित में से किसी के लिए हैंडलर को परिभाषित किया जा सकता है: जब तक इस स्टैक में कहीं एक हैंडलर परिभाषित है, तब तक लॉगिंग हो सकती है। उदाहरण के लिए लॉग इन किया गया संदेश  लकड़हारा, द्वारा लिखा जा सकता है   हैंडलर। आमतौर पर एक वैश्विक हैंडलर होता है जो किसी लकड़हारे द्वारा उत्पन्न संदेशों को प्राप्त करता है और संसाधित करता है।

गंभीरता स्तर
संदेश एक निश्चित स्तर पर लॉग किया गया है। सामान्य स्तर के नाम Apache Commons Logging से कॉपी किए गए हैं (हालांकि जावा लॉगिंग एपीआई विभिन्न स्तर के नामों को परिभाषित करता है):

लॉगिंग फ्रेमवर्क प्रत्येक लकड़हारे के लिए वर्तमान लॉगिंग स्तर को बनाए रखता है। लॉगिंग स्तर को कम या ज्यादा प्रतिबंधात्मक सेट किया जा सकता है। उदाहरण के लिए, यदि लॉगिंग स्तर चेतावनी पर सेट है, तो उस स्तर या उच्चतर के सभी संदेशों को लॉग किया जाता है: ERROR और FATAL।

लकड़हारे और परिशिष्ट दोनों को गंभीरता का स्तर सौंपा जा सकता है। आउटपुट उत्पन्न करने के लिए दिए गए गंभीरता स्तर के लिए दोनों को सक्षम किया जाना चाहिए। तो डीबग आउटपुट के लिए सक्षम लॉगर आउटपुट उत्पन्न नहीं करेगा यदि संदेश प्राप्त करने वाला हैंडलर डीबग के लिए भी सक्षम नहीं है।

फ़िल्टर
फ़िल्टर लॉग इवेंट को अनदेखा या लॉग करने का कारण बनता है। सबसे अधिक इस्तेमाल किया जाने वाला फ़िल्टर पिछले अनुभाग में प्रलेखित लॉगिंग स्तर है। लॉगिंग फ्रेमवर्क जैसे कि Log4j 2 और SLF4J भी मार्कर प्रदान करते हैं, जो लॉग ईवेंट से जुड़े होने पर फ़िल्टरिंग के लिए भी उपयोग किए जा सकते हैं। फेंके जा रहे अपवादों, लॉग संदेश के भीतर डेटा, थ्रेडलोकल में डेटा जो लॉगिंग एपीआई के माध्यम से उजागर किया गया है, या कई अन्य तरीकों के आधार पर लॉग इवेंट को स्वीकार या अस्वीकार करने के लिए फ़िल्टर का उपयोग किया जा सकता है।

फ़ॉर्मेटर्स, लेआउट्स या रेंडरर्स
एक फ़ॉर्मेटर एक वस्तु है जो किसी दिए गए ऑब्जेक्ट को स्वरूपित करता है। अधिकतर इसमें बाइनरी ऑब्जेक्ट लेना और इसे स्ट्रिंग प्रस्तुति में परिवर्तित करना शामिल है। प्रत्येक ढांचा एक डिफ़ॉल्ट आउटपुट स्वरूप को परिभाषित करता है जिसे वांछित होने पर ओवरराइड किया जा सकता है।

परिशिष्ट या हैंडलर
परिशिष्ट निर्दिष्ट न्यूनतम गंभीरता स्तर पर या उससे ऊपर के संदेशों को सुनते हैं। परिशिष्ट पारित संदेश लेता है और इसे उचित रूप से पोस्ट करता है। संदेश स्वभाव में शामिल हैं:
 * कंसोल पर प्रदर्शित करें
 * फ़ाइल या syslog में लिखें
 * एक डेटाबेस तालिका में संलग्न करें
 * जावा संदेश सेवा के माध्यम से वितरित करें
 * ईमेल द्वारा भेजें
 * सॉकेट पर लिखें
 * बिट-बकेट (/ dev/null) को छोड़ दें

विचार
JCL और Log4j बहुत आम हैं क्योंकि वे इतने लंबे समय से आसपास हैं और लंबे समय तक एकमात्र विकल्प थे। slf4j के लचीलेपन (नीचे लॉगबैक का उपयोग करके) ने इसे एक लोकप्रिय विकल्प बना दिया है।

SLF4J लॉगिंग रैपर (या शिम्स) का एक सेट है जो इसे किसी भी अन्य ढांचे की नकल करने की अनुमति देता है। इस प्रकार एकाधिक तृतीय-पक्ष पुस्तकालयों को एक अनुप्रयोग में शामिल किया जा सकता है, भले ही प्रत्येक लॉगिंग ढांचे का उपयोग करने के लिए चुना गया हो। हालाँकि सभी लॉगिंग आउटपुट मानक तरीके से उत्पन्न होते हैं, आमतौर पर लॉगबैक के माध्यम से।

Log4j 2 एपीआई और कार्यान्वयन दोनों प्रदान करता है। एपीआई को अन्य लॉगिंग कार्यान्वयनों के लिए रूट किया जा सकता है जो SLF4J कैसे काम करता है। SLF4J के विपरीत, Log4j 2 API संदेश लॉग करता है अतिरिक्त लचीलेपन के लिए स्ट्रिंग्स के बजाय ऑब्जेक्ट्स और जावा लैम्ब्डा एक्सप्रेशन का भी समर्थन करता है। जेसीएल वास्तव में एक लॉगिंग ढांचा नहीं है, लेकिन एक के लिए एक आवरण है। इस प्रकार, इसके नीचे एक लॉगिंग ढांचे की आवश्यकता होती है, हालांकि यह स्वयं का उपयोग करने के लिए डिफ़ॉल्ट हो सकता है  लकड़हारा।

JCL, SLF4J और Log4j 2 API पुन: प्रयोज्य पुस्तकालयों को विकसित करते समय उपयोगी होते हैं जिन्हें एप्लिकेशन द्वारा उपयोग किए जा रहे अंतर्निहित लॉगिंग सिस्टम को लिखने की आवश्यकता होती है। यह विषम वातावरणों में लचीलापन भी प्रदान करता है जहां लॉगिंग ढांचे को बदलने की संभावना है, हालांकि ज्यादातर मामलों में, लॉगिंग ढांचे को चुनने के बाद, परियोजना के जीवन में इसे बदलने की बहुत कम आवश्यकता होती है। SLF4J और Log4j 2 नए होने से लाभान्वित होते हैं और पुराने ढांचे से सीखे गए पाठों का निर्माण करते हैं। इसके अलावा जेसीएल को क्लास-लोडर्स के साथ समस्याएं ज्ञात हैं, यह निर्धारित करते समय कि किस लॉगिंग लाइब्रेरी को लपेटना चाहिए जो अब जेसीएल की जगह ले चुका है। जावा लॉगिंग एपीआई जावा के साथ प्रदान किया गया है। यद्यपि एपीआई तकनीकी रूप से जावा के साथ प्रदान किए गए डिफ़ॉल्ट कार्यान्वयन से अलग है, इसे वैकल्पिक कार्यान्वयन के साथ बदलना चुनौतीपूर्ण हो सकता है, इसलिए कई डेवलपर्स इस कार्यान्वयन को जावा लॉगिंग एपीआई के साथ भ्रमित करते हैं। कॉन्फ़िगरेशन केवल बाहरी फ़ाइलों द्वारा होता है जो फ्लाई पर आसानी से नहीं बदला जाता है (अन्य ढांचे प्रोग्रामेटिक कॉन्फ़िगरेशन का समर्थन करते हैं)। डिफ़ॉल्ट कार्यान्वयन केवल कुछ हैंडलर और फॉर्मेटर्स प्रदान करता है, जिसका अर्थ है कि अधिकांश उपयोगकर्ताओं को अपना खुद का लिखना होगा।

यह भी देखें

 * SLF4J
 * लॉग4जे
 * लॉगबैक
 * जावोल्यूशन लॉग कॉन्टेक्स्ट संदर्भ प्रोग्रामिंग पर आधारित है (रन-टाइम पर चयन योग्य वास्तविक लॉगिंग फ्रेमवर्क)।
 * रनटाइम इंटेलिजेंस

बाहरी संबंध

 * Java 6.0 Logging API
 * Commons Logging
 * Protomatter
 * Open Source Logging Tools in Java
 * The Apache 2.0 license.
 * Logback - A successor to the popular Log4j project
 * tinylog - Minimalist logging utility with a static logger
 * Loggifier A tool that inserts logging code into .class, .jar and .ear files
 * JLV - Java logging viewer which is currently available as a plugin for Eclipse IDE
 * Perf4j
 * SLF4J
 * Log4j 2