आपने अभी एक एप्लिकेशन बनाया है और देखा है कि कुछ इरादे के मुताबिक काम नहीं कर रहा है। आपने जो फीचर अभी लागू किया है वह उस तरह व्यवहार कर रहा है जिसकी आपने उम्मीद नहीं की थी। आपको क्या करना चाहिए? आप इस समस्या को कैसे हल करने जा रहे हैं?
सॉफ्टवेयर विकास में, प्रोग्रामर्स अपने सॉफ्टवेयर के चलने के दौरान घटनाओं को ट्रैक करने के लिए लॉगिंग पर भरोसा करते हैं। यह उन्हें समस्याओं का स्रोत प्रभावी ढंग से ट्रैक करने में मदद करता है जब वे उत्पन्न होती हैं।
इस गाइड में, हम बात करेंगे कि आपको एप्लिकेशन लॉग्स क्यों रखने चाहिए और आप अपने प्रोग्राम्स में घटनाओं को ट्रैक करने के लिए पायथन लॉगिंग मॉड्यूल का उपयोग कैसे कर सकते हैं।
आपको लॉग्स क्यों रखने चाहिए
लॉग्स रखने से आपको अधिक रखरखाव योग्य कोड लिखने में मदद मिलती है। जब आप लॉगिंग जैसे मॉड्यूल का उपयोग करते हैं, तो आप अपने प्रोग्राम्स में होने वाली सभी घटनाओं का सटीक रिकॉर्ड रख सकते हैं। इसका मतलब है कि आप देख सकते हैं कि कोड की कौन सी लाइनें चली हैं और कौन सी निष्पादित होने में विफल रही हैं।
पायथन में, डेवलपर्स अक्सर अपने कोड को लॉग करने के लिए print() स्टेटमेंट पर भरोसा करते हैं। यह एक अभ्यास है जिसका हर कोई - शुरुआती से लेकर विशेषज्ञ तक - उपयोग करने का दोषी है और अच्छे कारण के साथ। एक print() स्टेटमेंट उपयोग करना आसान है; यह सरल है।
हालांकि, print() स्टेटमेंट आपके कोड के लॉग्स रखने का सबसे अच्छा तरीका नहीं है। एक बात के लिए, print() स्टेटमेंट का उपयोग कंसोल पर किसी भी आउटपुट को प्रिंट करने के लिए किया जा सकता है। इसका मतलब है कि यह भ्रमित करने वाला हो सकता है कि कौन सा आउटपुट लॉग के रूप में स्टोर किया जाना है और कौन सा आउटपुट आपके मेन प्रोग्राम का हिस्सा है। क्या अधिक है, print() स्टेटमेंट डिफ़ॉल्ट रूप से आपके लॉग्स को सेव नहीं करता।
यहीं पर पायथन लॉगिंग मॉड्यूल काम आता है। लॉगिंग सिस्टम मॉड्यूल का उपयोग करके, आप अपने कोड में चले गए इवेंट्स का अधिक सटीक रिकॉर्ड रख सकते हैं। यह आपको अपने कोड को अधिक प्रभावी ढंग से डीबग करने और त्रुटियों को ठीक करने में मदद करेगा।
पायथन लॉगिंग मॉड्यूल का उपयोग कैसे करें
इस ट्यूटोरियल में, हम एक प्रोग्राम में बेसिक लॉगिंग मैसेजेस जोड़ने जा रहे हैं जो छात्रों के ग्रेड्स की सूची के माध्यम से जाता है और गणना करता है कि वे अपने एग्जाम में पास हुए हैं या फेल। निम्न कोड पर विचार करें:
students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
print("Calculating grade for {}".format(students[i]))
if grades[i] > 55:
pass_fail.append(True)
print("{} has passed their exam.".format(students[i]))
else:
pass_fail.append(False)
print("{} has failed their exam.".format(students[i]))
print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
ऊपर का कोड गणना करता है कि चौथी कक्षा के पांच छात्रों में से प्रत्येक अपने एग्जाम में पास हुआ है या फेल। हमारे प्रोग्राम में, हम तीन सूचियाँ घोषित करते हैं। एक सूची प्रत्येक छात्र का नाम स्टोर करती है; दूसरी सूची प्रत्येक छात्र द्वारा अर्जित ग्रेड स्टोर करती है; अंतिम सूची स्टोर करती है कि कोई छात्र पास हुआ है या फेल।
जब हम अपना प्रोग्राम चलाते हैं, तो निम्नलिखित लौटाया जाता है:
Calculating grade for Martin. Martin has passed their exam. Calculating grade for Lewis. Lewis has passed their exam. Calculating grade for Terri. Terri has passed their exam. Calculating grade for Bart. Bart has failed their exam.
print() स्टेटमेंट दिखाता है कि हमारा कोड काम कर रहा है, लेकिन हम इस डेटा को दिखाने के लिए logging() मॉड्यूल का उपयोग कर सकते हैं। यह हमें अपने डिबगिंग मैसेजेस को अपने प्रोग्राम के आउटपुट से अलग करने की अनुमति देगा।
शुरू करने के लिए, आइए अपने प्रोग्राम के शीर्ष पर लॉगिंग स्टैंडर्ड लाइब्रेरी जोड़ें:
import logging
अब जब हमने लॉगिंग लाइब्रेरी आयात कर ली है, तो हम अपने कोड में लॉग्स का ट्रैक रखना शुरू कर सकते हैं। इस उदाहरण के लिए, हम DEBUG कॉन्फ़िगरेशन का उपयोग करके लॉग्स का ट्रैक रखने जा रहे हैं। ऐसा इसलिए है क्योंकि हम इस समय वार्निंग्स ट्रैक करने में रुचि नहीं रखते। संदर्भ के लिए, यहाँ वे लॉगिंग विकल्प हैं जिन्हें आप निर्दिष्ट कर सकते हैं:
- CRITICAL: गंभीर त्रुटियों को प्रदर्शित करने के लिए उपयोग किया जाता है (logging.critical())
- ERROR: एक समस्या दिखाने के लिए उपयोग किया जाता है (logging.error())
- WARNING: अप्रत्याशित व्यवहार दिखाने के लिए उपयोग किया जाता है (logging.warning())
- INFO: दिखाने के लिए उपयोग किया जाता है कि प्रोग्राम काम कर रहा है (logging.info())
- DEBUG: कोड डीबग करने के लिए उपयोग किया जाता है (logging.debug())
लॉगिंग लाइब्रेरी के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन WARNING है, इसलिए हमें इसे इस कोड का उपयोग करके रीसेट करना होगा:
import logging logging.basicConfig(level=logging.DEBUG)
अब हम अपने कोड को डीबग करना शुरू करने के लिए तैयार हैं। आइए अपने print() स्टेटमेंट्स को जो हमें बताते हैं कि ग्रेड की गणना की जा रही है या हमारा प्रोग्राम समाप्त हो गया है, डिबगिंग स्टेटमेंट्स से बदलें:
import logging
logging.basicConfig(level=logging.DEBUG)
students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
logging.debug("Calculating grade for {}".format(students[i]))
if grades[i] > 55:
pass_fail.append(True)
print("{} has passed their exam.".format(students[i]))
else:
pass_fail.append(False)
print("{} has failed their exam.".format(students[i]))
logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
जब हम अपना कोड चलाते हैं, तो निम्नलिखित लौटाया जाता है:
DEBUG:root:Calculating grade for Martin Martin has passed their exam. DEBUG:root:Calculating grade for Lewis Lewis has passed their exam. DEBUG:root:Calculating grade for Terri Terri has passed their exam. DEBUG:root:Calculating grade for Bart Bart has failed their exam. DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
आप देख सकते हैं कि हमारे आउटपुट में पहले जैसी ही सामग्री है। हालांकि, संदेश "Calculating grade for..." और वह संदेश जो हमें सूचित करता है कि ग्रेड्स की गणना की गई है, अलग तरह से दिखाई देते हैं। उन स्टेटमेंट्स से पहले "DEBUG:root:" टेक्स्ट दिखाई देता है।
यह हमें किसी भी समय हमारे प्रोग्राम द्वारा किए जा रहे कार्यों का ट्रैक रखने की अनुमति देता है। क्योंकि लॉगिंग इवेंट्स मॉड्यूल हमारे प्रोग्राम में उपरोक्त टेक्स्ट जोड़ता है, यह पता लगाना आसान है कि हमारे प्रोग्राम द्वारा कौन सा टेक्स्ट आउटपुट किया गया है और कौन सा टेक्स्ट डिबगिंग के लिए है।
इस मामले में, संदेश "[student] has failed their exam" महत्वपूर्ण जानकारी है जो हमें बताती है कि प्रत्येक छात्र पास हुआ है या फेल। बाकी सब यह देखने के लिए उपयोगी है कि हमारा प्रोग्राम कैसे चल रहा है, लेकिन उपयोगकर्ता के लिए उपयोगी नहीं है। इसलिए, हम इन स्टेटमेंट्स को लॉगिंग कॉल्स का उपयोग करके ट्रैक करते हैं।
फ़ाइल में लॉग्स कैसे रखें
लॉगिंग मॉड्यूल आपको अपनी लॉग्स को एक फ़ाइल में ट्रैक करने की अनुमति देता है। यह उपयोगी है क्योंकि इसका मतलब है कि आप अपने लॉग्स को एक बार अपना पायथन शेल बंद करने पर नहीं खोएंगे। आपके पास एक स्थायी रिकॉर्ड होगा कि आपका प्रोग्राम किसी विशेष अवसर पर कैसे निष्पादित हुआ।
आपको बस अपने लॉगिंग हैंडलर कॉन्फ़िगरेशन लाइन में एक filename आर्ग्यूमेंट शामिल करना है और आपका प्रोग्राम स्वचालित रूप से लॉग्स को फ़ाइल में सेव कर देगा:
import logging logging.basicConfig(level=logging.DEBUG, filename="student_data.log") ...
जब हम अपना कोड चलाते हैं, तो हमारे लॉग्स हमारे द्वारा निर्दिष्ट फ़ाइलनाम में जोड़ दिए जाएंगे। यदि हम "student_data.log" फ़ाइल खोलते हैं, तो निम्नलिखित लौटाया जाता है:
DEBUG:root:Calculating grade for Martin DEBUG:root:Calculating grade for Lewis DEBUG:root:Calculating grade for Terri DEBUG:root:Calculating grade for Bart DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
ध्यान दें कि हमारे डिबग आउटपुट में केवल वे मैसेजेस हैं जिन्हें हमने logging.debug() मेथड का उपयोग करके लॉग्स के रूप में निर्दिष्ट किया है। यह उपयोगी है क्योंकि यह प्रोग्राम आउटपुट - जिसे print() स्टेटमेंट का उपयोग करके दर्शाया जाता है - को डिबग लॉग्स से अलग करने में मदद करता है।
आप यह ट्रैक करने के लिए एक पैरामीटर भी जोड़ सकते हैं कि लॉग में कोई एंट्री कब जोड़ी गई है। हम निम्न कोड का उपयोग करके ऐसा कर सकते हैं:
logging.basicConfig(
level=logging.DEBUG,
filename="student_data.log",
format="%(asctime)s:%(levelname)s:%(message)s"
)
यह कोड हमारी student_data.log फ़ाइल में निम्नलिखित जोड़ता है:
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart 2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
अब हम जानते हैं कि हमारे कोड की प्रत्येक लाइन कब निष्पादित हुई थी। एक लंबे प्रोग्राम में, यह डेटा विशेष रूप से उपयोगी होगा क्योंकि यह हमें यह समझने में मदद करेगा कि हमारा कोड किस क्रम में चल रहा है और हमारे कोड की गति।
निष्कर्ष
पायथन लॉगिंग मॉड्यूल डिबगिंग के लिए एक अविश्वसनीय रूप से उपयोगी टूल है। यह आपको अपने प्रोग्राम में चलने वाले सभी इवेंट्स को ट्रैक करने में मदद करता है और उन इवेंट्स को एक अलग फ़ाइल के रूप में सेव करने का विकल्प देता है। यह आपको अपने कोड को अधिक प्रभावी ढंग से डीबग करने और यह समझने में मदद करेगा कि जब आप कोई प्रोग्राम चलाते हैं तो कौन से इवेंट्स निष्पादित हुए हैं।