इस मार्गदर्शिका का उद्देश्य आपको मूलभूत अंतर्दृष्टि और प्रथाओं से लैस करना है ताकि आप अपनी सेवाओं की अधिक प्रभावी ढंग से निगरानी और समस्या निवारण कर सकें। एप्लिकेशन डेवलपमेंट में, लॉगिंग को अक्सर अनदेखा कर दिया जाता है, लेकिन यह एक मजबूत और अवलोकन योग्य सिस्टम बनाने का एक महत्वपूर्ण घटक है। उचित लॉगिंग अभ्यास आपके एप्लिकेशन की दृश्यता को बढ़ा सकते हैं, इसके आंतरिक कामकाज की आपकी समझ को गहरा कर सकते हैं, और समग्र एप्लिकेशन स्वास्थ्य में सुधार कर सकते हैं। डिफ़ॉल्ट लॉगिंग आपके एप्लिकेशन के एंट्री पॉइंट पर डिफ़ॉल्ट लॉगिंग मैकेनिज्म को शामिल करना अत्यधिक लाभकारी है। यह स्वचालित लॉगिंग आवश्यक इंटरैक्शन को कैप्चर कर सकती है और संभावित रूप से एंट्री पॉइंट के तर्कों को शामिल कर सकती है। हालाँकि, सावधान रहना महत्वपूर्ण है क्योंकि पासवर्ड जैसी संवेदनशील जानकारी लॉग करने से गोपनीयता और सुरक्षा जोखिम पैदा हो सकते हैं। सामान्य प्रवेश बिंदु : आने वाले अनुरोधों और प्रतिक्रियाओं के बारे में लॉग विवरण API एंडपॉइंट : कार्य प्रारंभ बिंदु, निष्पादन विवरण और परिणाम लॉग करें पृष्ठभूमि कार्य : एसिंक्रोनस इवेंट और संबंधित इंटरैक्शन की हैंडलिंग को लॉग करें एसिंक्रोनस इवेंट व्यापक लॉगिंग आपके एप्लिकेशन द्वारा की जाने वाली प्रत्येक महत्वपूर्ण कार्रवाई के लिए एक लॉग प्रविष्टि तैयार करनी चाहिए, विशेष रूप से वे क्रियाएँ जो इसकी स्थिति को बदलती हैं। यह संपूर्ण लॉगिंग दृष्टिकोण समस्याओं के उत्पन्न होने पर उन्हें शीघ्रता से पहचानने और संबोधित करने के लिए महत्वपूर्ण है, जो आपके एप्लिकेशन के स्वास्थ्य और कार्यक्षमता के बारे में एक पारदर्शी दृष्टिकोण प्रदान करता है। लॉगिंग में इस तरह की तत्परता आसान निदान और रखरखाव सुनिश्चित करती है। उपयुक्त लॉग स्तर का चयन करना आपके एप्लिकेशन द्वारा उत्पन्न विशाल मात्रा में डेटा को प्रबंधित करने और व्याख्या करने के लिए उचित लॉग स्तरों को अपनाना महत्वपूर्ण है। लॉग को उनकी गंभीरता और प्रासंगिकता के आधार पर वर्गीकृत करके, आप सुनिश्चित करते हैं कि महत्वपूर्ण मुद्दों की तुरंत पहचान की जाए और उनका समाधान किया जाए, जबकि कम जरूरी जानकारी आपके निगरानी प्रयासों को प्रभावित किए बिना सुलभ बनी रहे। लॉग स्तरों का प्रभावी ढंग से उपयोग करने के लिए नीचे दिशानिर्देश दिए गए हैं: स्तर विवरण एवं उदाहरण स्वीकृत उपयोग स्वीकार नहीं किया गया ERROR घातक घटनाएँ जो सिस्टम संचालन को रोक देती हैं। उदाहरण के लिए, डेटाबेस कनेक्शन खो जाना गंभीर सिस्टम त्रुटियाँ गैर-महत्वपूर्ण त्रुटियाँ, जैसे उपयोगकर्ता द्वारा लॉगिन प्रयास विफल होना WARN समस्या तो है लेकिन सिस्टम निष्पादन जारी रख सकता है और अनुरोधित ऑपरेशन पूरा कर सकता है संभावित मुद्दे जो समस्याओं को जन्म देते हैं नियमित अवस्था में परिवर्तन INFO सामान्य अनुप्रयोग कार्यों की जानकारी, जैसे उपयोगकर्ता खाता निर्माण या डेटा लेखन राज्य परिवर्तन बिना किसी बदलाव के केवल पढ़ने के लिए संचालन DEBUG विस्तृत निदान जानकारी, जैसे प्रक्रिया प्रारंभ/समाप्ति लॉगिंग प्रक्रिया चरण सिस्टम स्थिति को नहीं बदलते हैं नियमित अवस्था परिवर्तन या उच्च आवृत्ति संचालन TRACE विधि प्रविष्टियाँ/निकास सहित सबसे विस्तृत स्तर किसी प्रक्रिया के प्रवाह और विवरण को समझना संवेदनशील जानकारी लॉग करना कौन सी आईडी लॉग करें - पदानुक्रमिक दृष्टिकोण अपने एप्लिकेशन में क्रियाएँ लॉग करते समय, लॉग जानकारी को डेटाबेस डेटा से लिंक करने के लिए सीधे तौर पर शामिल संस्थाओं की आईडी शामिल करना महत्वपूर्ण है। एक पदानुक्रमित दृष्टिकोण आपको आइटम को उनके मूल समूहों या श्रेणियों से जोड़कर अपने एप्लिकेशन के किसी विशिष्ट भाग से जुड़े सभी लॉग को जल्दी से खोजने में मदद करता है। उदाहरण के लिए, जब कोई संदेश भेजने में विफल रहता है, तो केवल चैट की आईडी लॉग करने के बजाय, आपको चैट रूम और उस कंपनी की आईडी भी लॉग करनी चाहिए। इस तरह, आप अधिक संदर्भ प्राप्त करते हैं और समस्या के व्यापक प्रभाव को देख सकते हैं। उदाहरण लॉग प्रविष्टि: Failed to send the message - chat=$roomId, chatRoomId=chatRoomId, company=$companyId उत्पादन लॉग का उदाहरण पदानुक्रमिक दृष्टिकोण का उपयोग करते समय उत्पादन लॉग कैसे दिख सकते हैं, इसका एक उदाहरण नीचे दिया गया है: संगति और मानकीकरण मानक उपसर्ग सभी टीमों में लॉग प्रारूपों को मानकीकृत करने से आपके लॉग को पढ़ना और समझना बहुत आसान हो सकता है। यहाँ कुछ मानकीकृत उपसर्ग दिए गए हैं जिन पर विचार किया जाना चाहिए: कुछ करना शुरू करना कुछ करने में असफल कुछ काम किया पूरा कुछ काम करना छोड़ दिया कुछ करने का पुनः प्रयास करें चर मानों को अलग से लॉग करें लॉग संदेशों के मुख्य भाग से चर नामों और मानों को अलग करने से कई लाभ मिलते हैं: विशिष्ट जानकारी को फ़िल्टर करना और ढूंढना आसान बनाता है लॉग खोज और पार्सिंग को सरल बनाता है: लॉग संदेश लिखने की प्रक्रिया को सरल रखता है लॉग संदेश निर्माण को सरल बनाता है: बड़े मान लॉग संदेश की पठनीयता को बाधित नहीं करेंगे संदेश अव्यवस्था को रोकता है: उदाहरण लॉग प्रारूप: Log message - valueName=value प्रस्तावित प्रथाओं का उपयोग करने वाले लॉग के उदाहरण सैद्धांतिक उदाहरण यहां चर्चा की गई सर्वोत्तम प्रथाओं का पालन करते हुए अच्छी तरह से संरचित लॉग प्रविष्टियों के उदाहरण दिए गए हैं: 2023-10-05 14:32:01 [INFO] Successful login attempt - userId=24543, teamId=1321312 2023-10-05 14:33:17 [WARN] Failed login attempt - userId=536435, teamId=1321312 ये उदाहरण दर्शाते हैं: : "सफल लॉगिन प्रयास" और "असफल लॉगिन प्रयास" जैसे स्पष्ट, सुसंगत उपसर्ग लॉग को समझने में आसान बनाते हैं। मानकीकृत लॉग उपसर्ग : चर नाम और मान लॉग संदेश से अलग कर दिए जाते हैं, जिससे स्पष्टता बनी रहती है और खोज सरल हो जाती है। पृथक चर मान : संरचित प्रारूप यह सुनिश्चित करता है कि लॉग को पढ़ना और पार्स करना आसान हो, जिससे कुशल समस्या निवारण और निगरानी में सहायता मिलती है। पठनीयता और सुसंगतता उत्पादन लॉग का उदाहरण प्रस्तावित पद्धतियों का उपयोग करते समय उत्पादन लॉग कैसे दिख सकते हैं, इसका एक उदाहरण नीचे दिया गया है: ट्रेस आईडी लॉग को किसी विशिष्ट उपयोगकर्ता क्रिया के साथ प्रभावी रूप से संबद्ध करने के लिए, आपके लॉग में या जैसा कि इसे भी कहा जाता है, शामिल करना महत्वपूर्ण है। उस प्रविष्टि बिंदु द्वारा ट्रिगर किए गए तर्क द्वारा उत्पन्न सभी लॉग में आईडी सुसंगत रहनी चाहिए, जिससे घटनाओं के अनुक्रम का स्पष्ट दृश्य मिलता है। traceId correlationId कार्यान्वयन उदाहरण जबकि डेटाडॉग जैसी कुछ निगरानी सेवाएँ लॉग ग्रुपिंग को बॉक्स से बाहर प्रदान करती हैं, इसे मैन्युअल रूप से भी लागू किया जा सकता है। स्प्रिंग का उपयोग करने वाले कोटलिन एप्लिकेशन में, आप हैंडलरइंटरसेप्टर का उपयोग करके REST अनुरोधों के लिए ट्रेस आईडी को लागू कर सकते हैं। @Component class TraceIdInterceptor : HandlerInterceptor { companion object { private const val TRACE_ID = "traceId" } override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean { val traceId = UUID.randomUUID().toString() MDC.put(TRACE_ID, traceId) return true } override fun afterCompletion(request: HttpServletRequest, response: HttpServletResponse, handler: Any, ex: Exception?) { MDC.remove(TRACE_ID) } } यह इंटरसेप्टर प्रत्येक अनुरोध के लिए एक अद्वितीय उत्पन्न करता है, अनुरोध के आरंभ में इसे MDC में जोड़ता है और अनुरोध पूरा होने के बाद इसे हटा देता है। traceId ट्रेसआईडी के साथ उदाहरण लॉग इस तरह के लॉग एकत्रीकरण को लागू करने से आप नीचे दिए गए उदाहरण के समान लॉग फ़िल्टर करने में सक्षम होंगे लॉग में UUID बनाम लंबी आईडी का उपयोग करना कई प्रणालियों में, इकाइयाँ अपने प्राथमिक पहचानकर्ता के रूप में या तो या ID का उपयोग कर सकती हैं, जबकि कुछ प्रणालियाँ विभिन्न उद्देश्यों के लिए दोनों प्रकार की ID का उपयोग कर सकती हैं। लॉगिंग उद्देश्यों के लिए प्रत्येक प्रकार के निहितार्थों को समझना एक सूचित विकल्प बनाने के लिए महत्वपूर्ण है। UUID Long यहां विचार करने योग्य बातों का विवरण दिया गया है: आईडी पढ़ने में आसान होती हैं और काफी छोटी होती हैं, खासकर यदि वे रेंज के उच्च अंत पर न हों। पठनीयता: Long Long ID पूरे सिस्टम में विशिष्टता प्रदान करते हैं, जिससे आप ID टकराव की समस्याओं का सामना किए बिना ID का उपयोग करके लॉग खोज सकते हैं। यहाँ टकराव का मतलब है कि एक संभावना है कि असंबंधित DB तालिकाओं से 2 संस्थाओं की एक ही ID होगी। अद्वितीय मान: UUID Long : उन प्रणालियों में जो इकाई आईडी के रूप में लंबी प्राथमिक कुंजियों का उपयोग करते हैं, एक यादृच्छिक आईडी जोड़ना आमतौर पर सीधा होता है, इकाई आईडी के साथ एक वितरित सिस्टम में विशेष रूप से लॉगिंग के लिए आईडी रखना चुनौतीपूर्ण या महंगा हो सकता है। सिस्टम सीमाएँ UUID UUID Long लॉग में इस्तेमाल की जाने वाली आईडी के प्रकार में एकरूपता महत्वपूर्ण है, कम से कम हर इकाई के लिए। अगर सिस्टम पहले से ही कुछ इकाइयों के लिए लॉग तैयार करता है और आप उन सभी को बदलने पर विचार नहीं कर रहे हैं, तो इकाई की पहचान करने के लिए पहले से इस्तेमाल किए गए प्रकार के साथ बने रहना बेहतर है। संक्रमण अवधि के दौरान दोनों आईडी लॉग करने पर विचार किया जा सकता है, लेकिन स्थायी रूप से कई आईडी होने से लॉग अनावश्यक रूप से अव्यवस्थित हो जाएंगे। मौजूदा लॉग: निष्कर्ष प्रभावी सेवा अवलोकन के लिए उचित लॉगिंग अभ्यास आवश्यक हैं। व्यापक लॉगिंग, उचित लॉग स्तर, ट्रेस आईडी और मानकीकृत लॉग प्रारूपों को शामिल करके, आप अपने अनुप्रयोगों की निगरानी और समस्या निवारण करने की अपनी क्षमता को महत्वपूर्ण रूप से बढ़ा सकते हैं। ये अभ्यास आपके लॉग की स्पष्टता और स्थिरता में सुधार करते हैं, जिससे समस्याओं का निदान और त्वरित समाधान करना आसान हो जाता है। इस पोस्ट को पढ़ने के लिए समय निकालने के लिए धन्यवाद!