paint-brush
लॉगिंग को सही तरीके से करना: ऑब्जर्वेबिलिटी फाउंडेशनद्वारा@feddena
842 रीडिंग
842 रीडिंग

लॉगिंग को सही तरीके से करना: ऑब्जर्वेबिलिटी फाउंडेशन

द्वारा Fedor Denisov6m2024/06/22
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

लॉगिंग एप्लिकेशन डेवलपमेंट का एक महत्वपूर्ण लेकिन अक्सर कम आंका जाने वाला घटक है। उचित लॉगिंग अभ्यास आपके एप्लिकेशन की दृश्यता को बढ़ा सकते हैं और इसके आंतरिक कामकाज की आपकी समझ को गहरा कर सकते हैं। इस गाइड का उद्देश्य आपको मूलभूत अंतर्दृष्टि और अभ्यासों से लैस करना है ताकि यह सुनिश्चित हो सके कि आप अपनी सेवाओं की अधिक प्रभावी ढंग से निगरानी और समस्या निवारण कर सकें।
featured image - लॉगिंग को सही तरीके से करना: ऑब्जर्वेबिलिटी फाउंडेशन
Fedor Denisov HackerNoon profile picture

इस मार्गदर्शिका का उद्देश्य आपको मूलभूत अंतर्दृष्टि और प्रथाओं से लैस करना है ताकि आप अपनी सेवाओं की अधिक प्रभावी ढंग से निगरानी और समस्या निवारण कर सकें।


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


डिफ़ॉल्ट लॉगिंग

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

सामान्य प्रवेश बिंदु

  • API एंडपॉइंट : आने वाले अनुरोधों और प्रतिक्रियाओं के बारे में लॉग विवरण
  • पृष्ठभूमि कार्य : कार्य प्रारंभ बिंदु, निष्पादन विवरण और परिणाम लॉग करें
  • एसिंक्रोनस इवेंट : एसिंक्रोनस इवेंट और संबंधित इंटरैक्शन की हैंडलिंग को लॉग करें

व्यापक लॉगिंग

आपके एप्लिकेशन द्वारा की जाने वाली प्रत्येक महत्वपूर्ण कार्रवाई के लिए एक लॉग प्रविष्टि तैयार करनी चाहिए, विशेष रूप से वे क्रियाएँ जो इसकी स्थिति को बदलती हैं। यह संपूर्ण लॉगिंग दृष्टिकोण समस्याओं के उत्पन्न होने पर उन्हें शीघ्रता से पहचानने और संबोधित करने के लिए महत्वपूर्ण है, जो आपके एप्लिकेशन के स्वास्थ्य और कार्यक्षमता के बारे में एक पारदर्शी दृष्टिकोण प्रदान करता है। लॉगिंग में इस तरह की तत्परता आसान निदान और रखरखाव सुनिश्चित करती है।

उपयुक्त लॉग स्तर का चयन करना

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


लॉग स्तरों का प्रभावी ढंग से उपयोग करने के लिए नीचे दिशानिर्देश दिए गए हैं:

स्तर

विवरण एवं उदाहरण

स्वीकृत उपयोग

स्वीकार नहीं किया गया

ERROR

घातक घटनाएँ जो सिस्टम संचालन को रोक देती हैं। उदाहरण के लिए, डेटाबेस कनेक्शन खो जाना

गंभीर सिस्टम त्रुटियाँ

गैर-महत्वपूर्ण त्रुटियाँ, जैसे उपयोगकर्ता द्वारा लॉगिन प्रयास विफल होना

WARN

समस्या तो है लेकिन सिस्टम निष्पादन जारी रख सकता है और अनुरोधित ऑपरेशन पूरा कर सकता है

संभावित मुद्दे जो समस्याओं को जन्म देते हैं

नियमित अवस्था में परिवर्तन

INFO

सामान्य अनुप्रयोग कार्यों की जानकारी, जैसे उपयोगकर्ता खाता निर्माण या डेटा लेखन

राज्य परिवर्तन

बिना किसी बदलाव के केवल पढ़ने के लिए संचालन

DEBUG

विस्तृत निदान जानकारी, जैसे प्रक्रिया प्रारंभ/समाप्ति

लॉगिंग प्रक्रिया चरण सिस्टम स्थिति को नहीं बदलते हैं

नियमित अवस्था परिवर्तन या उच्च आवृत्ति संचालन

TRACE

विधि प्रविष्टियाँ/निकास सहित सबसे विस्तृत स्तर

किसी प्रक्रिया के प्रवाह और विवरण को समझना

संवेदनशील जानकारी लॉग करना

कौन सी आईडी लॉग करें - पदानुक्रमिक दृष्टिकोण

अपने एप्लिकेशन में क्रियाएँ लॉग करते समय, लॉग जानकारी को डेटाबेस डेटा से लिंक करने के लिए सीधे तौर पर शामिल संस्थाओं की आईडी शामिल करना महत्वपूर्ण है। एक पदानुक्रमित दृष्टिकोण आपको आइटम को उनके मूल समूहों या श्रेणियों से जोड़कर अपने एप्लिकेशन के किसी विशिष्ट भाग से जुड़े सभी लॉग को जल्दी से खोजने में मदद करता है।


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

उदाहरण लॉग प्रविष्टि:

Failed to send the message - chat=$roomId, chatRoomId=chatRoomId, company=$companyId

उत्पादन लॉग का उदाहरण

पदानुक्रमिक दृष्टिकोण का उपयोग करते समय उत्पादन लॉग कैसे दिख सकते हैं, इसका एक उदाहरण नीचे दिया गया है:

डेटाडॉग उन लॉग के साथ UI लॉग करता है जो सुझाए गए पदानुक्रमित दृष्टिकोण का उपयोग करते हैं

संगति और मानकीकरण

मानक उपसर्ग

सभी टीमों में लॉग प्रारूपों को मानकीकृत करने से आपके लॉग को पढ़ना और समझना बहुत आसान हो सकता है। यहाँ कुछ मानकीकृत उपसर्ग दिए गए हैं जिन पर विचार किया जाना चाहिए:

  • कुछ करना शुरू करना
  • कुछ करने में असफल
  • कुछ काम पूरा किया
  • कुछ काम करना छोड़ दिया
  • कुछ करने का पुनः प्रयास करें

चर मानों को अलग से लॉग करें

लॉग संदेशों के मुख्य भाग से चर नामों और मानों को अलग करने से कई लाभ मिलते हैं:

  • लॉग खोज और पार्सिंग को सरल बनाता है: विशिष्ट जानकारी को फ़िल्टर करना और ढूंढना आसान बनाता है
  • लॉग संदेश निर्माण को सरल बनाता है: लॉग संदेश लिखने की प्रक्रिया को सरल रखता है
  • संदेश अव्यवस्था को रोकता है: बड़े मान लॉग संदेश की पठनीयता को बाधित नहीं करेंगे

उदाहरण लॉग प्रारूप:

 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

ये उदाहरण दर्शाते हैं:

  • मानकीकृत लॉग उपसर्ग : "सफल लॉगिन प्रयास" और "असफल लॉगिन प्रयास" जैसे स्पष्ट, सुसंगत उपसर्ग लॉग को समझने में आसान बनाते हैं।


  • पृथक चर मान : चर नाम और मान लॉग संदेश से अलग कर दिए जाते हैं, जिससे स्पष्टता बनी रहती है और खोज सरल हो जाती है।


  • पठनीयता और सुसंगतता : संरचित प्रारूप यह सुनिश्चित करता है कि लॉग को पढ़ना और पार्स करना आसान हो, जिससे कुशल समस्या निवारण और निगरानी में सहायता मिलती है।

उत्पादन लॉग का उदाहरण

प्रस्तावित पद्धतियों का उपयोग करते समय उत्पादन लॉग कैसे दिख सकते हैं, इसका एक उदाहरण नीचे दिया गया है:

डेटाडॉग 'आरंभ से' उपसर्ग द्वारा फ़िल्टर के साथ UI लॉग करता है

ट्रेस आईडी

लॉग को किसी विशिष्ट उपयोगकर्ता क्रिया के साथ प्रभावी रूप से संबद्ध करने के लिए, आपके लॉग में 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 बनाम लंबी आईडी का उपयोग करना

कई प्रणालियों में, इकाइयाँ अपने प्राथमिक पहचानकर्ता के रूप में या तो UUID या Long ID का उपयोग कर सकती हैं, जबकि कुछ प्रणालियाँ विभिन्न उद्देश्यों के लिए दोनों प्रकार की ID का उपयोग कर सकती हैं। लॉगिंग उद्देश्यों के लिए प्रत्येक प्रकार के निहितार्थों को समझना एक सूचित विकल्प बनाने के लिए महत्वपूर्ण है।


यहां विचार करने योग्य बातों का विवरण दिया गया है:


पठनीयता: Long आईडी पढ़ने में आसान होती हैं और काफी छोटी होती हैं, खासकर यदि वे Long रेंज के उच्च अंत पर न हों।


अद्वितीय मान: UUID ID पूरे सिस्टम में विशिष्टता प्रदान करते हैं, जिससे आप ID टकराव की समस्याओं का सामना किए बिना ID का उपयोग करके लॉग खोज सकते हैं। यहाँ टकराव का मतलब है कि एक संभावना है कि असंबंधित DB तालिकाओं से 2 संस्थाओं की एक ही Long ID होगी।


सिस्टम सीमाएँ : उन प्रणालियों में जो इकाई आईडी के रूप में लंबी प्राथमिक कुंजियों का उपयोग करते हैं, एक यादृच्छिक UUID आईडी जोड़ना आमतौर पर सीधा होता है, UUID इकाई आईडी के साथ एक वितरित सिस्टम में विशेष रूप से लॉगिंग के लिए Long आईडी रखना चुनौतीपूर्ण या महंगा हो सकता है।


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


निष्कर्ष

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


इस पोस्ट को पढ़ने के लिए समय निकालने के लिए धन्यवाद!