Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रेल्स में लॉगिंग में महारत हासिल करना:डिबगिंग से लेकर प्रोएक्टिव अलर्ट तक

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

<पी> अच्छे लॉग अपने लिए दस गुना भुगतान करते हैं। वे उन पेचीदा बगों का निदान करना आसान बनाते हैं, और यदि आप सही तरीके से लॉग करते हैं, तो वे आपके उपयोगकर्ताओं के नोटिस करने से पहले ही आपको मुद्दों के बारे में सचेत कर सकते हैं। लेकिन 'सही तरीके से लॉगिंग करने' का क्या मतलब है?

<पी> लॉगिंग शुरू करना आसान है लेकिन इसमें महारत हासिल करना कठिन है। इस पोस्ट में, हम जानेंगे कि आप अपने रेल एप्लिकेशन के लॉग का उनकी पूरी क्षमता से कैसे उपयोग कर सकते हैं।

रेल में लॉग इन करना

<पी> आइए पहले बुनियादी बातों के बारे में बात करें। जब आप एक नया रेल एप्लिकेशन शुरू करते हैं, तो आपके लिए लॉगिंग पहले से ही सेट हो जाती है। रेल ActiveSupport::Logger का एक नया उदाहरण आरंभ करेगी जिसे आप अपने एप्लिकेशन के भीतर कहीं भी उपयोग कर सकते हैं।

 <पी> रेल लॉगर मानक आउटपुट या log/<environment>.log को लिखता है और आपके द्वारा स्पष्ट रूप से लिखे गए किसी भी लॉग संदेश के अलावा आने वाले अनुरोधों या निष्पादित प्रश्नों को स्वचालित रूप से लॉग करेगा।

<पी> ऐसे कई तरीके हैं जिनसे आप रेल लॉग को कॉन्फ़िगर कर सकते हैं, जैसा कि रेल के दस्तावेज़ में उत्कृष्ट रूप से बताया गया है।

<पी> अपने लॉग का अधिकतम लाभ उठाने के लिए, हम विशेष रूप से लॉग स्तरों के साथ-साथ लॉग फ़ॉर्मेटिंग को सेट करने में रुचि रखते हैं।

<पी> लेकिन इससे निपटने से पहले, आइए इस बारे में बात करें कि हमें लॉग क्यों लिखना चाहिए।

अच्छी लॉगिंग, ख़राब लॉगिंग

<पी> लॉग का उद्देश्य आपको सिस्टम घटनाओं के बारे में सूचित करना है ताकि आप उन पर प्रतिक्रिया दे सकें। उदाहरण के लिए, जब कोई त्रुटि होती है, तो एक लॉग संदेश आपको इसके बारे में इस तरह से बताएगा कि आप समझ सकें।

<पी> आप किसी लॉगमैसेज को कितनी अच्छी तरह समझते हैं यह इस बात पर निर्भर करता है कि वह कितना वर्णनात्मक और प्रासंगिक है। एक वर्णनात्मक लॉग संदेश क्या हुआ इसके बारे में प्रासंगिक जानकारी प्रदान करता है। एक प्रासंगिक लॉग संदेश में सिस्टम की स्थिति के बारे में जानकारी शामिल होती है जब सिस्टम ने इसे लिखा था।

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

 <पी> अब आइए ऐसी स्थिति की कल्पना करें जहां एक ग्राहक किसी समस्या की रिपोर्ट करता है, और आप मदद के लिए लॉग देखते हैं। आप यह देख सकते हैं:

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

रेल में लॉग स्तर

<पी> डिफ़ॉल्ट रेल लॉगर लॉग स्तर DEBUG प्रदान करता है , INFO , WARN , और ERROR . उनका उपयोग करके, आप लॉग संदेशों को प्रासंगिकता की विभिन्न श्रेणियों में समूहित कर सकते हैं। यह न केवल आपको लॉग संदेशों को फ़िल्टर करने में मदद करता है, बल्कि कुछ संदर्भ भी प्रदान करता है।

<पी> यह तय करना चुनौतीपूर्ण हो सकता है कि कब किस लॉग स्तर का उपयोग करना है। यहां कुछ सामान्य नियम दिए गए हैं:

  • DEBUG :सिस्टम के भीतर होने वाली गतिविधियों के बारे में विस्तृत जानकारी के लिए इस लॉग स्तर का उपयोग करें। आप डिबग स्टेटमेंट का उपयोग तब कर सकते हैं जब विधियाँ दर्ज की जाती हैं या बाहर निकलती हैं, या कहीं भी आपको लगता है कि यह डिबगिंग के दौरान मूल्य जोड़ सकता है।
  • INFO :जब भी आपका सिस्टम अपनी स्थिति बदलता है, या कोई प्रासंगिक घटना घटती है, तो INFO तक पहुंचें स्तर. रेल अनुप्रयोगों के संदर्भ में सामान्य सूचना संदेशों के उदाहरण प्राप्त अनुरोध, बाहरी एपीआई को भेजे गए अनुरोध, या कार्य प्रारंभ और समापन हैं।
  • WARN :इस लॉग का उपयोग यह दर्शाने के लिए करें कि कुछ अप्रत्याशित घटित हुआ है। यह अभी तक कोई समस्या नहीं है (क्योंकि आपका एप्लिकेशन इसे संभाल सकता है), लेकिन अगर ऐसा होता रहता है, तो इस पर आपका ध्यान आकर्षित हो सकता है।
  • ERROR :कोई त्रुटि होने पर इस लॉग स्तर का उपयोग करें। त्रुटियाँ अमान्य एप्लिकेशन बताती हैं जिनका समाधान आपको यथाशीघ्र करना होगा।
<पी> आप संबंधित पर्यावरण फ़ाइल को संशोधित करके अपने एप्लिकेशन द्वारा लिखे गए लॉग संदेशों के प्रकार को बदल सकते हैं। आम तौर पर, रेल DEBUG को हटा देगी। संदेश उत्पादन में हैं, लेकिन आप उसे बदल सकते हैं।

 <पी> आइए उपरोक्त लॉग-स्तरीय सुझावों को हमारे कोड नमूने पर लागू करें।

 <पी> डिबगिंग करते समय, अब हम WARN को देखकर समस्याओं के मूल कारणों की पहचान कर सकते हैं और ERROR संदेश. दुख की बात है कि हमारे लॉगमैसेज अब और अधिक वर्णनात्मक नहीं हो गए हैं।

वर्णनात्मक लॉग संदेश

<पी> वर्णनात्मक लॉग संदेश व्याख्या के लिए कोई जगह नहीं छोड़ते हैं। वे पाठक को जो कुछ हुआ उसके बारे में तुरंत जानकारी देने के लिए आवश्यक विवरण प्रदान करते हैं।

<पी> जब आप 'An error occurred' जैसे संदेश पढ़ते हैं , आप सोच में पड़ जायेंगे कि त्रुटि क्या है। आप अपने लॉग संदेश लिखते समय इस तरह के भ्रम से बचना चाहते हैं। वर्णनात्मक लॉग संदेश लिखते समय सबसे महत्वपूर्ण बात यह है कि स्वयं को लॉग रीडर की जगह पर रखें। क्या आपके लॉग पढ़ते समय उन्हें वह सारी जानकारी मिल जाएगी जिसकी उन्हें आवश्यकता है?

<पी> आइए संदेश 'An error occurred' बदलें त्रुटि के लिए, उसके संदेश सहित।

 <पी> यह एक सुधार है. आइए हमारे उदाहरण में अन्य लॉग संदेशों की जाँच करें। 'Method entered' हमें यह नहीं बताता कि कौन सा तरीका बुलाया गया था, 'Response success' वास्तविक प्रतिक्रिया छोड़ देता है, और 'Response failure' विफलता की प्रकृति के बारे में कोई जानकारी नहीं दी गई है। आइए इसे बदलें।

 <पी> नोट :आपने देखा होगा कि हम अपने लॉग के साथ स्ट्रिंग इंटरपोलेशन करते समय ब्लॉक सिंटैक्स का उपयोग करते हैं। जब एप्लिकेशन का लॉग स्तर लॉग संदेशों के स्तर से अधिक हो तो इसका उपयोग करने से अनावश्यक गणना से बचा जा सकता है। उदाहरण के लिए,log.debug("Some #{concatenation}") हमेशा स्ट्रिंग संयोजन निष्पादित करेगा, लेकिन log.debug { "Some #{concatenation}" } ऐसा केवल तभी किया जाएगा जब लॉग स्तर डीबग करने के लिए सेट हो।  
 <पी> हमारे लॉग अब बहुत बेहतर ढंग से पढ़े जाते हैं। इसमें कोई संदेह नहीं है कि प्रत्येक लॉग संदेश क्या दर्शाता है।

लॉग संदेशों के लिए अतिरिक्त संदर्भ

<पी> हमारे नए लॉग संदेश जो कुछ हुआ उसकी स्पष्ट तस्वीर प्रदान करते हैं। चूँकि यह एक सरल उदाहरण है, हमें इस बात की भी अच्छी समझ है कि कुछ चीज़ें क्यों घटित हुईं। हकीकत में, यह आमतौर पर इतना आसान नहीं है।

<पी> उस संदर्भ के बारे में अतिरिक्त जानकारी प्रदान करना जिसमें सिस्टम ने प्रत्येक संदेश लिखा है, डिबगिंग में महत्वपूर्ण रूप से मदद कर सकता है।

<पी> उदाहरण के लिए, अनुरोध या प्रतिक्रिया लॉग करते समय, यह जानना सहायक हो सकता है कि अनुरोध किसने किया। त्रुटियों के लिए स्टैक ट्रेस संलग्न करना उपयोगी हो सकता है ताकि हम त्रुटि क्यों हुई, इसके बारे में अतिरिक्त जानकारी एकत्र कर सकें।

 <पी> नोट :आपने संभवतः देखा होगा कि जब आप रेल्स के डिफ़ॉल्ट लॉगर का उपयोग करते हैं तो प्रासंगिक जानकारी के साथ लॉग संदेश बनाना बोझिल हो सकता है। सौभाग्य से, Ougai या MrLogaLoga जैसे कस्टम लॉगर इसे बहुत आसान बनाते हैं।  

संरचित लॉगिंग

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

<पी> मेरा पसंदीदा प्रारूप JSON है, लेकिन आप किस टूल का उपयोग करते हैं, इसके आधार पर आप लॉगस्टैश जैसे अन्य लॉग प्रारूप पसंद कर सकते हैं। आप एक कस्टम लॉग फ़ॉर्मेटर बनाकर अपने लॉग संदेशों का प्रारूप बदल सकते हैं।

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

AppSignal के साथ रेल लॉगिंग

<पी> अब जबकि आपके लॉग अच्छे और पठनीय हैं, तो उन्हें और अधिक सुलभ बनाना अच्छा होगा। आख़िरकार, आप किसी मशीन में एसएसएच नहीं करना चाहते हैं और वहां लॉग को पीछे या पकड़ना नहीं चाहते हैं, है ना?

<पी> सौभाग्य से, ऐपसिग्नल ने हाल ही में बीटा में एक लॉगिंग सुविधा लॉन्च की है! यह आपको सीधे ऐपसिग्नल वेब इंटरफ़ेस में रेल लॉग का निरीक्षण और विश्लेषण करने की अनुमति देता है।

<पी> आप बाईं ओर के मेनू में 'लॉगिंग' टैब के माध्यम से हमारे लॉगिंग बीटा तक पहुंच सकते हैं:

<पी> रेल्स में लॉगिंग में महारत हासिल करना:डिबगिंग से लेकर प्रोएक्टिव अलर्ट तक

<पी> यदि आप हमारे रूबी लॉगिंग डॉक्स में दिए गए चरणों का पालन करते हैं, तो आप AppSignal::Logger का उपयोग करने के लिए रेल्स लॉगर को कॉन्फ़िगर कर सकते हैं। नीचे दिए गए कोड को config/environment.rb में डालकर क्लास करें initialization से पहले फ़ाइल करें :

<पी> आप संरचित लॉग को JSON प्रारूप में या लॉगरेज के साथ भी शामिल कर सकते हैं।

<पी> एक बार जब आप सब कुछ सेट कर लें, तो आपको अपने रेल लॉग्स को AppSignal पर दिखाई देना चाहिए!

<पी> रेल्स में लॉगिंग में महारत हासिल करना:डिबगिंग से लेकर प्रोएक्टिव अलर्ट तक

लॉगिंग और त्रुटि रिपोर्टिंग

<पी> आप इसे ऐपसिग्नल ब्लॉग पर पढ़ रहे हैं, इसलिए आपको आश्चर्य हो सकता है:अगर मैं पहले से ही एक अच्छे त्रुटि रिपोर्टिंग प्लेटफ़ॉर्म का उपयोग कर रहा हूं तो मुझे लॉगिंग की परवाह क्यों करनी चाहिए?

<पी> यह एक अच्छा प्रश्न है. त्रुटि ट्रैकिंग उपकरण एप्लिकेशन त्रुटियों के बारे में विस्तृत जानकारी प्रदान करते हैं। वे किसी भी एप्लिकेशन त्रुटि के फुलस्टैक ट्रेस को कैप्चर करते हैं और बॉक्स से बाहर बहुत सारी प्रासंगिक जानकारी प्रदान करते हैं।

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

<पी> वास्तव में, अच्छी तरह से लिखे गए लॉग त्रुटि ट्रैकिंग टूल को बढ़ाते हैं और उनका समर्थन करते हैं। आपको संभवतः दोनों का उपयोग करना चाहिए।

समाप्ति

<पी> इस पोस्ट में, हमने देखा कि आप अपने लॉग से अधिकतम लाभ कैसे प्राप्त कर सकते हैं। हमने देखा कि रेल्स में लॉग इन करना शुरू करना आसान है, लेकिन उपयोगी लॉग लिखना चुनौतीपूर्ण हो सकता है।

<पी> जिन लॉग में वर्णनात्मकता या संदर्भ की कमी है, वे कम मूल्य प्रदान करते हुए आपकी डिस्क को भर देंगे। हालाँकि, जो लॉग सही लॉग स्तरों का उपयोग करते हैं और पाठकों को उनकी आवश्यक जानकारी प्रदान करते हैं, वे एक बड़ी संपत्ति हैं।

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

<पी> हमने यह भी पता लगाया कि आप अपने लॉग तक आसानी से पहुंचने के लिए ऐपसिग्नल की नई लॉगिंग सुविधा का उपयोग कैसे कर सकते हैं। अंत में, हमने इस बात पर चर्चा की कि लॉग को बदलने के बजाय त्रुटि ट्रैकिंग टूल को कैसे बढ़ाया जाना चाहिए।

<पी> हैप्पी लॉगिंग!

<पी> पी.एस. यदि आप प्रेस से हटते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और एक भी पोस्ट न चूकें! रेल्स में लॉगिंग में महारत हासिल करना:डिबगिंग से लेकर प्रोएक्टिव अलर्ट तक

हंस-जॉर्ग श्नडलिट्ज़

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

<पी> हंस-जॉर्ग श्नडलिट्ज़

द्वारा सभी लेख
  1. एक जावास्क्रिप्ट कंस्ट्रक्टर के लिए एक संपत्ति, विधि कैसे जोड़ें? एक जावास्क्रिप्ट कंस्ट्रक्टर के लिए एक संपत्ति, विधि कैसे जोड़ें?

    जावास्क्रिप्ट कंस्ट्रक्टर में प्रॉपर्टी, विधि जोड़ने के लिए निम्नलिखित कोड है - उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <t

  1. स्थानीय समय एपीआई कक्षा का उपयोग करके एंड्रॉइड में स्थानीय समय कैसे प्राप्त करें? स्थानीय समय एपीआई कक्षा का उपयोग करके एंड्रॉइड में स्थानीय समय कैसे प्राप्त करें?

    यह उदाहरण इस बारे में प्रदर्शित करता है कि स्थानीय समय एपीआई वर्ग का उपयोग करके एंड्रॉइड में स्थानीय समय कैसे प्राप्त करें। चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/ac

  1. हम प्रोग्रामिक रूप से एंड्रॉइड एडिटटेक्स्ट के लिए इनपुट प्रकार कैसे सेट करते हैं? हम प्रोग्रामिक रूप से एंड्रॉइड एडिटटेक्स्ट के लिए इनपुट प्रकार कैसे सेट करते हैं?

    यह उदाहरण दर्शाता है कि मैं प्रोग्राम के अनुसार Android EditText के लिए इनपुट प्रकार कैसे सेट करूं। चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/activity_main.xml में जोड़