अधिकांश लोगों को लॉग्स की आवश्यकता का एहसास तभी होता है जब उन्हें उनकी सबसे ज्यादा जरूरत होती है। लेकिन जब आपका एप्लिकेशन टूट जाता है, यूजर शिकायतें आने लगती हैं, और आपको कोई सुराग नहीं होता कि इसे कैसे ठीक किया जाए, तो कुछ लॉग मैसेज जोड़ने में बहुत देर हो चुकी होती है जो मदद कर सकते थे।
अच्छे लॉग्स अपने आप को दस गुना भुगतान करते हैं। वे उन मुश्किल बग्स का निदान करना आसान बनाते हैं, और यदि आप लॉग्स को सही करते हैं, तो वे आपके यूजर्स के नोटिस करने से पहले ही आपको मुद्दों के प्रति सचेत कर सकते हैं। लेकिन 'लॉगिंग को सही करना' का क्या मतलब है?
लॉगिंग शुरू करना आसान है लेकिन मास्टर करना कठिन है। इस पोस्ट में, हम इस बात पर गहराई से जाएंगे कि आप अपने रेल्स एप्लिकेशन के लॉग्स का पूरी क्षमता से उपयोग कैसे कर सकते हैं।
रेल्स में लॉगिंग
आइए पहले बुनियादी बातों के बारे में बात करें। जब आप एक नया रेल्स एप्लिकेशन शुरू करते हैं, तो लॉगिंग पहले से ही आपके लिए सेट अप होता है। रेल्स ActiveSupport::Logger का एक नया इंस्टेंस इनिशियलाइज़ करेगा जिसका उपयोग आप अपने एप्लिकेशन में कहीं भी कर सकते हैं।
रेल्स लॉगर स्टैंडर्ड आउटपुट या log/<environment>.log पर लिखता है और आपके द्वारा स्पष्ट रूप से लिखे गए किसी भी लॉग मैसेज के अलावा इनकमिंग रिक्वेस्ट या निष्पादित क्वेरी को स्वचालित रूप से लॉग करेगा।
रेल्स लॉग्स को कॉन्फिगर करने के कई तरीके हैं, जैसा कि रेल्स के दस्तावेज में उत्कृष्ट रूप से उल्लिखित है।
अपने लॉग्स का अधिकतम लाभ उठाने के लिए, हम विशेष रूप से लॉग लेवल सेट करने के साथ-साथ लॉग फॉर्मेटिंग में रुचि रखते हैं।
लेकिन उससे पहले, आइए बात करते हैं कि हमें लॉग क्यों लिखना चाहिए।
अच्छी लॉगिंग, बुरी लॉगिंग
लॉग्स का उद्देश्य आपको सिस्टम घटनाओं के बारे में सूचित करना है ताकि आप उन पर प्रतिक्रिया दे सकें। उदाहरण के लिए, जब एक एरर होती है, तो एक लॉग मैसेज को इसके बारे में आपको इस तरह बताना चाहिए जिसे आप समझ सकें।
आप एक लॉग मैसेज को कितनी अच्छी तरह समझते हैं यह इस बात पर निर्भर करता है कि यह कितना वर्णनात्मक और प्रासंगिक है। एक वर्णनात्मक लॉग मैसेज जो हुआ उसके बारे में प्रासंगिक जानकारी प्रदान करता है। एक प्रासंगिक लॉग मैसेज में सिस्टम की स्थिति के बारे में जानकारी शामिल होती है जब सिस्टम ने इसे लिखा था।
आइए एक सरल उदाहरण पर विचार करें कि हमें दोनों की आवश्यकता क्यों है। यहां कुछ कोड है जो एक एक्सटर्नल API को कॉल करता है और जब यूजर एक रिक्वेस्ट करता है तो उसकी प्रतिक्रिया लौटाता है।
अब आइए एक ऐसी स्थिति की कल्पना करें जहां एक ग्राहक एक समस्या की रिपोर्ट करता है, और आप मदद के लिए लॉग्स में देखते हैं। यह वही है जो आप देख सकते हैं:
ये लॉग मैसेज कुछ जानकारी प्रदान करते हैं, लेकिन लगभग पर्याप्त नहीं। हम ग्राहक द्वारा रिपोर्ट की गई एरर के लिए जिम्मेदार क्या है यह पता लगाने के करीब नहीं हैं। ये लॉग मैसेज वर्णनात्मकता और संदर्भ की कमी रखते हैं। वे शोर हैं। हम उन्हें कैसे सुधार सकते हैं?
रेल्स में लॉग लेवल
डिफ़ॉल्ट रेल्स लॉगर लॉग लेवल DEBUG, INFO, WARN, और ERROR प्रदान करता है। उनका उपयोग करके, आप लॉग मैसेजेस को प्रासंगिकता की विभिन्न श्रेणियों में समूहित कर सकते हैं। यह न केवल लॉग मैसेजेस को फ़िल्टर करने में आपकी मदद करता है, बल्कि कुछ संदर्भ भी प्रदान करता है।
यह तय करना चुनौतीपूर्ण हो सकता है कि किस लॉग लेवल का उपयोग कब करना है। यहां कुछ नियम हैं:
DEBUG: सिस्टम के भीतर होने वाली कार्रवाइयों के बारे में विस्तृत जानकारी के लिए इस लॉग लेवल का उपयोग करें। आप डीबग स्टेटमेंट का उपयोग तब कर सकते हैं जब मेथड्स में प्रवेश किया जाता है या बाहर निकला जाता है, या कहीं भी आपको लगता है कि यह डीबगिंग के दौरान मूल्य जोड़ सकता है।INFO: जब भी आपका सिस्टम अपनी स्थिति बदलता है, या कुछ प्रासंगिक घटना होती है,INFOलेवल तक पहुंचें। रेल्स एप्लिकेशन के संदर्भ में सामान्य इन्फो मैसेज के उदाहरण प्राप्त रिक्वेस्ट, एक्सटर्नल APIs को भेजे गए रिक्वेस्ट, या जॉब्स शुरू होना और खत्म होना हैं।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 है, लेकिन आपके द्वारा उपयोग किए जाने वाले टूल्स के आधार पर, आप Logstash जैसे अन्य लॉग प्रारूपों को पसंद कर सकते हैं। आप एक कस्टम लॉग फॉर्मेटर बनाकर अपने लॉग मैसेज के प्रारूप को बदल सकते हैं।
कस्टम फॉर्मेटर खुद लिखने के बजाय, आप कई जेम्स में से एक का उपयोग कर सकते हैं जो कस्टम लॉग फॉर्मेटर प्रदान करते हैं। मैं Lograge की सिफारिश करता हूं, जो न केवल आउट-ऑफ-द-बॉक्स फॉर्मेटिंग प्रदान करता है बल्कि रेल्स के कुछ हद तक वर्बोज रिक्वेस्ट फॉर्मेटिंग को भी साफ करता है ताकि इसे पढ़ना बहुत आसान हो जाए।
AppSignal के साथ रेल्स लॉगिंग
अब जब आपके लॉग्स अच्छे और पठनीय हैं, तो उन्हें और अधिक सुलभ बनाना अच्छा होगा। आखिरकार, आप किसी मशीन में SSH करके वहां लॉग्स को टेल या ग्रेप नहीं करना चाहते, है ना?
सौभाग्य से, AppSignal ने हाल ही में बीटा में एक लॉगिंग फीचर लॉन्च किया है! यह आपको AppSignal वेब इंटरफेस में सीधे रेल्स लॉग्स का निरीक्षण और विश्लेषण करने की अनुमति देता है।
आप बाएं हाथ के साइड मेनू में 'Logging' टैब के माध्यम से हमारे लॉगिंग बीटा तक पहुंच सकते हैं:

यदि आप हमारे रूबी लॉगिंग डॉक्स में चरणों का पालन करते हैं, तो आप config/environment.rb फाइल में initialization से पहले नीचे दिए गए कोड को रखकर रेल्स लॉगर को AppSignal::Logger क्लास का उपयोग करने के लिए कॉन्फिगर कर सकते हैं:
आप JSON प्रारूप में स्ट्रक्चर्ड लॉग्स या Lograge के साथ भी इनजेस्ट कर सकते हैं।
एक बार सब कुछ सेट हो जाने पर, आपको अपने रेल्स लॉग्स AppSignal पर दिखाई देने चाहिए!

लॉगिंग और एरर रिपोर्टिंग
आप इसे AppSignal ब्लॉग पर पढ़ रहे हैं, तो आप सोच सकते हैं: अगर मैं पहले से ही एक अच्छे एरर रिपोर्टिंग प्लेटफॉर्म का उपयोग कर रहा हूं तो मुझे लॉगिंग की परवाह क्यों करनी चाहिए?
यह एक अच्छा सवाल है। एरर ट्रैकिंग टूल्स एप्लिकेशन एरर के बारे में विस्तृत जानकारी प्रदान करते हैं। वे किसी भी एप्लिकेशन एरर का पूरा स्टैक ट्रेस कैप्चर करते हैं और बॉक्स से बाहर बहुत सारी प्रासंगिक जानकारी प्रदान करते हैं।
हालांकि, जबकि अधिकांश टूल्स आपको एरर के अलावा घटनाओं को कैप्चर करने की अनुमति देते हैं, इन टूल्स को मनमाने मात्रा में मैसेज भेजना आमतौर पर अव्यावहारिक है। आप विस्तृत, ऐतिहासिक जानकारी को प्रतिस्थापित नहीं कर पाएंगे जो अच्छी तरह से लिखे गए लॉग्स प्रदान करते हैं।
वास्तव में, अच्छी तरह से लिखे गए लॉग्स एरर ट्रैकिंग टूल्स को बढ़ाते हैं और समर्थन करते हैं। आपको संभवतः दोनों का उपयोग करना चाहिए।
समापन
इस पोस्ट में, हमने देखा कि आप अपने लॉग्स का अधिकतम लाभ कैसे प्राप्त कर सकते हैं। हमने देखा कि रेल्स में लॉगिंग के साथ शुरुआत करना आसान है, लेकिन उपयोगी लॉग्स लिखना चुनौतीपूर्ण हो सकता है।
वर्णनात्मकता या संदर्भ की कमी वाले लॉग्स अंततः आपके डिस्क को भर देंगे जबकि बहुत कम मूल्य प्रदान करेंगे। हालांकि, सही लॉग लेवल का उपयोग करने वाले और पाठकों को आवश्यक जानकारी प्रदान करने वाले लॉग्स एक बड़ी संपत्ति हैं।
एक बार जब आप शानदार लॉग मैसेज लिखने में महारत हासिल कर लेते हैं, तो आप चीजों को आगे ले जा सकते हैं और उन्हें इस तरह फॉर्मेट कर सकते हैं जो लॉग विश्लेषण और आसान फ़िल्टरिंग की अनुमति देता है।
हमने यह भी देखा कि आप अपने लॉग्स को आसानी से एक्सेस करने के लिए AppSignal की नई लॉगिंग फीचर का उपयोग कैसे कर सकते हैं। अंत में, हमने इस बात पर चर्चा की कि लॉग्स को एरर ट्रैकिंग टूल्स को प्रतिस्थापित करने के बजाय बढ़ाना चाहिए।
हैप्पी लॉगिंग!
P.S. यदि आप प्रेस से बाहर आते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट मिस न करें!
Hans-Jörg Schnedlitz
हमारे गेस्ट लेखक Hans वियना, ऑस्ट्रिया के एक रेल्स इंजीनियर हैं। वह अपना अधिकांश समय कोडिंग या कोडिंग के बारे में पढ़ने में बिताते हैं, और कभी-कभी अपने ब्लॉग पर इसके बारे में लिखते भी हैं! जब वह स्क्रीन के सामने नहीं बैठे होते, तो आप शायद उन्हें बाहर, किसी पहाड़ पर चढ़ते हुए पाएंगे।
Hans-Jörg Schnedlitz के सभी लेख