इस मार्गदर्शिका का उद्देश्य आपको मूलभूत अंतर्दृष्टि और प्रथाओं से लैस करना है ताकि आप अपनी सेवाओं की अधिक प्रभावी ढंग से निगरानी और समस्या निवारण कर सकें।
एप्लिकेशन डेवलपमेंट में, लॉगिंग को अक्सर अनदेखा कर दिया जाता है, लेकिन यह एक मजबूत और अवलोकन योग्य सिस्टम बनाने का एक महत्वपूर्ण घटक है। उचित लॉगिंग अभ्यास आपके एप्लिकेशन की दृश्यता को बढ़ा सकते हैं, इसके आंतरिक कामकाज की आपकी समझ को गहरा कर सकते हैं, और समग्र एप्लिकेशन स्वास्थ्य में सुधार कर सकते हैं।
आपके एप्लिकेशन के एंट्री पॉइंट पर डिफ़ॉल्ट लॉगिंग मैकेनिज्म को शामिल करना अत्यधिक लाभकारी है। यह स्वचालित लॉगिंग आवश्यक इंटरैक्शन को कैप्चर कर सकती है और संभावित रूप से एंट्री पॉइंट के तर्कों को शामिल कर सकती है। हालाँकि, सावधान रहना महत्वपूर्ण है क्योंकि पासवर्ड जैसी संवेदनशील जानकारी लॉग करने से गोपनीयता और सुरक्षा जोखिम पैदा हो सकते हैं।
आपके एप्लिकेशन द्वारा की जाने वाली प्रत्येक महत्वपूर्ण कार्रवाई के लिए एक लॉग प्रविष्टि तैयार करनी चाहिए, विशेष रूप से वे क्रियाएँ जो इसकी स्थिति को बदलती हैं। यह संपूर्ण लॉगिंग दृष्टिकोण समस्याओं के उत्पन्न होने पर उन्हें शीघ्रता से पहचानने और संबोधित करने के लिए महत्वपूर्ण है, जो आपके एप्लिकेशन के स्वास्थ्य और कार्यक्षमता के बारे में एक पारदर्शी दृष्टिकोण प्रदान करता है। लॉगिंग में इस तरह की तत्परता आसान निदान और रखरखाव सुनिश्चित करती है।
आपके एप्लिकेशन द्वारा उत्पन्न विशाल मात्रा में डेटा को प्रबंधित करने और व्याख्या करने के लिए उचित लॉग स्तरों को अपनाना महत्वपूर्ण है। लॉग को उनकी गंभीरता और प्रासंगिकता के आधार पर वर्गीकृत करके, आप सुनिश्चित करते हैं कि महत्वपूर्ण मुद्दों की तुरंत पहचान की जाए और उनका समाधान किया जाए, जबकि कम जरूरी जानकारी आपके निगरानी प्रयासों को प्रभावित किए बिना सुलभ बनी रहे।
लॉग स्तरों का प्रभावी ढंग से उपयोग करने के लिए नीचे दिशानिर्देश दिए गए हैं:
स्तर | विवरण एवं उदाहरण | स्वीकृत उपयोग | स्वीकार नहीं किया गया |
---|---|---|---|
| घातक घटनाएँ जो सिस्टम संचालन को रोक देती हैं। उदाहरण के लिए, डेटाबेस कनेक्शन खो जाना | गंभीर सिस्टम त्रुटियाँ | गैर-महत्वपूर्ण त्रुटियाँ, जैसे उपयोगकर्ता द्वारा लॉगिन प्रयास विफल होना |
| समस्या तो है लेकिन सिस्टम निष्पादन जारी रख सकता है और अनुरोधित ऑपरेशन पूरा कर सकता है | संभावित मुद्दे जो समस्याओं को जन्म देते हैं | नियमित अवस्था में परिवर्तन |
| सामान्य अनुप्रयोग कार्यों की जानकारी, जैसे उपयोगकर्ता खाता निर्माण या डेटा लेखन | राज्य परिवर्तन | बिना किसी बदलाव के केवल पढ़ने के लिए संचालन |
| विस्तृत निदान जानकारी, जैसे प्रक्रिया प्रारंभ/समाप्ति | लॉगिंग प्रक्रिया चरण सिस्टम स्थिति को नहीं बदलते हैं | नियमित अवस्था परिवर्तन या उच्च आवृत्ति संचालन |
| विधि प्रविष्टियाँ/निकास सहित सबसे विस्तृत स्तर | किसी प्रक्रिया के प्रवाह और विवरण को समझना | संवेदनशील जानकारी लॉग करना |
अपने एप्लिकेशन में क्रियाएँ लॉग करते समय, लॉग जानकारी को डेटाबेस डेटा से लिंक करने के लिए सीधे तौर पर शामिल संस्थाओं की आईडी शामिल करना महत्वपूर्ण है। एक पदानुक्रमित दृष्टिकोण आपको आइटम को उनके मूल समूहों या श्रेणियों से जोड़कर अपने एप्लिकेशन के किसी विशिष्ट भाग से जुड़े सभी लॉग को जल्दी से खोजने में मदद करता है।
उदाहरण के लिए, जब कोई संदेश भेजने में विफल रहता है, तो केवल चैट की आईडी लॉग करने के बजाय, आपको चैट रूम और उस कंपनी की आईडी भी लॉग करनी चाहिए। इस तरह, आप अधिक संदर्भ प्राप्त करते हैं और समस्या के व्यापक प्रभाव को देख सकते हैं।
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) } }
यह इंटरसेप्टर प्रत्येक अनुरोध के लिए एक अद्वितीय traceId
उत्पन्न करता है, अनुरोध के आरंभ में इसे MDC में जोड़ता है और अनुरोध पूरा होने के बाद इसे हटा देता है।
इस तरह के लॉग एकत्रीकरण को लागू करने से आप नीचे दिए गए उदाहरण के समान लॉग फ़िल्टर करने में सक्षम होंगे
कई प्रणालियों में, इकाइयाँ अपने प्राथमिक पहचानकर्ता के रूप में या तो UUID
या Long
ID का उपयोग कर सकती हैं, जबकि कुछ प्रणालियाँ विभिन्न उद्देश्यों के लिए दोनों प्रकार की ID का उपयोग कर सकती हैं। लॉगिंग उद्देश्यों के लिए प्रत्येक प्रकार के निहितार्थों को समझना एक सूचित विकल्प बनाने के लिए महत्वपूर्ण है।
यहां विचार करने योग्य बातों का विवरण दिया गया है:
पठनीयता: Long
आईडी पढ़ने में आसान होती हैं और काफी छोटी होती हैं, खासकर यदि वे Long
रेंज के उच्च अंत पर न हों।
अद्वितीय मान: UUID
ID पूरे सिस्टम में विशिष्टता प्रदान करते हैं, जिससे आप ID टकराव की समस्याओं का सामना किए बिना ID का उपयोग करके लॉग खोज सकते हैं। यहाँ टकराव का मतलब है कि एक संभावना है कि असंबंधित DB तालिकाओं से 2 संस्थाओं की एक ही Long
ID होगी।
सिस्टम सीमाएँ : उन प्रणालियों में जो इकाई आईडी के रूप में लंबी प्राथमिक कुंजियों का उपयोग करते हैं, एक यादृच्छिक UUID
आईडी जोड़ना आमतौर पर सीधा होता है, UUID
इकाई आईडी के साथ एक वितरित सिस्टम में विशेष रूप से लॉगिंग के लिए Long
आईडी रखना चुनौतीपूर्ण या महंगा हो सकता है।
मौजूदा लॉग: लॉग में इस्तेमाल की जाने वाली आईडी के प्रकार में एकरूपता महत्वपूर्ण है, कम से कम हर इकाई के लिए। अगर सिस्टम पहले से ही कुछ इकाइयों के लिए लॉग तैयार करता है और आप उन सभी को बदलने पर विचार नहीं कर रहे हैं, तो इकाई की पहचान करने के लिए पहले से इस्तेमाल किए गए प्रकार के साथ बने रहना बेहतर है। संक्रमण अवधि के दौरान दोनों आईडी लॉग करने पर विचार किया जा सकता है, लेकिन स्थायी रूप से कई आईडी होने से लॉग अनावश्यक रूप से अव्यवस्थित हो जाएंगे।
प्रभावी सेवा अवलोकन के लिए उचित लॉगिंग अभ्यास आवश्यक हैं। व्यापक लॉगिंग, उचित लॉग स्तर, ट्रेस आईडी और मानकीकृत लॉग प्रारूपों को शामिल करके, आप अपने अनुप्रयोगों की निगरानी और समस्या निवारण करने की अपनी क्षमता को महत्वपूर्ण रूप से बढ़ा सकते हैं। ये अभ्यास आपके लॉग की स्पष्टता और स्थिरता में सुधार करते हैं, जिससे समस्याओं का निदान और त्वरित समाधान करना आसान हो जाता है।
इस पोस्ट को पढ़ने के लिए समय निकालने के लिए धन्यवाद!