त्रुटि प्रबंधन के लिए पायथन लॉगिंग को अनुकूलित करना
किसी प्रोग्राम के निष्पादन के दौरान घटनाओं पर नज़र रखने और समस्याओं का निदान करने के लिए पायथन में लॉग इन करना आवश्यक है। हालाँकि, कुछ मॉड्यूल अत्यधिक ट्रेस जानकारी उत्पन्न कर सकते हैं, जो लॉग को अव्यवस्थित कर सकता है। ऐसे मामलों में, उचित लॉगिंग स्तर सेट करना, जैसे गलती, अनावश्यक विवरणों को फ़िल्टर करने में मदद कर सकता है।
ऐसे परिदृश्यों में जहां एक मॉड्यूल अत्यधिक लॉग उत्पन्न करता है, लेकिन दूसरे मॉड्यूल में इसे कॉल करने में त्रुटियां होती हैं, हाल के लॉग संदेशों तक पहुंचना महत्वपूर्ण हो जाता है। किसी त्रुटि के मूल कारण का पता लगाते समय अक्सर ऐसा होता है। अत्यधिक लॉग को अनदेखा करने और महत्वपूर्ण लॉग को कैप्चर करने के बीच संतुलन की आवश्यकता है।
पुस्तकालय पसंद हैं spdlog C++ में रिंग बफ़र के माध्यम से बैकट्रैकिंग के लिए अंतर्निहित समर्थन है, जो डेवलपर्स को त्रुटि उत्पन्न करने वाले हालिया लॉग की समीक्षा करने की अनुमति देता है। अजगर का काटना हालाँकि, लाइब्रेरी इस सुविधा को बॉक्स से बाहर पेश नहीं करती है, जिससे यह सवाल उठता है कि समान तंत्र को कैसे लागू किया जाए।
यह आलेख बताता है कि त्रुटि होने पर हाल के लॉग संदेशों को कैप्चर करने के लिए आप पायथन के लॉगिंग सिस्टम को कैसे अनुकूलित कर सकते हैं, जिससे महत्वपूर्ण जानकारी सुनिश्चित हो सके चेकर मॉड्यूल ट्रेस डेटा के साथ लॉग को प्रभावित किए बिना निदान के लिए उपलब्ध है।
| आज्ञा | उपयोग का उदाहरण |
|---|---|
| deque(maxlen=capacity) | से एक डबल-एंड कतार संग्रह मॉड्यूल, यहां एक रिंग बफ़र बनाने के लिए उपयोग किया जाता है जो एक निश्चित संख्या में लॉग संदेश रखता है, नए संदेश आने पर सबसे पुराने को हटा देता है। हाल के संदेशों के लॉग को कुशलतापूर्वक बनाए रखने के लिए यह एक महत्वपूर्ण संरचना है। |
| emit(self, record) | प्रत्येक लॉग संदेश को उत्पन्न होते ही संसाधित करने के लिए कस्टम लॉगिंग हैंडलर में ओवरराइड की गई एक विधि। यह लॉग संदेश को जोड़ने के लिए जिम्मेदार है डेक हमारे कस्टम रिंग बफ़र समाधान में। |
| logging.handlers.MemoryHandler | यह एक लॉगिंग हैंडलर है जो बफ़र्स संदेशों को मेमोरी में लॉग करता है। एक निश्चित लॉग स्तर पर पहुंचने पर यह उन्हें फ्लश कर देता है (इस मामले में, गलती). यह अधिक गंभीर घटना होने तक लॉग संदेशों के आउटपुट को स्थगित करने के लिए उपयोगी है। |
| flushLevel=logging.ERROR | को एक तर्क दिया गया मेमोरीहैंडलर लॉग स्तर को निर्दिष्ट करने के लिए जो बफ़र किए गए संदेशों को अंतिम गंतव्य (जैसे कंसोल या फ़ाइल) तक फ्लशिंग ट्रिगर करता है। यह सुनिश्चित करता है कि यदि कोई त्रुटि होती है तो हम केवल डिबग लॉग देखेंगे। |
| setTarget(stream_handler) | में मेमोरीहैंडलर दृष्टिकोण, यह विधि लक्ष्य हैंडलर को सेट करती है जिसमें बफ़र किए गए लॉग को फ्लश किया जाएगा। इस मामले में, लक्ष्य एक है स्ट्रीमहैंडलर, जो लॉग को कंसोल पर आउटपुट करता है। |
| format(record) | लॉगिंग मॉड्यूल के फ़ॉर्मेटिंग सिस्टम का हिस्सा। कस्टम हैंडलर में, यह विधि लॉग रिकॉर्ड को रिंग बफ़र में जोड़ने से पहले प्रारूपित करती है, जिससे सुसंगत और पठनीय आउटपुट की अनुमति मिलती है। |
| logger.addHandler(buffer_handler) | कस्टम या मेमोरी हैंडलर को लॉगर से जोड़ता है ताकि यह हैंडलर के कॉन्फ़िगरेशन (उदाहरण के लिए, बफरिंग, सर्कुलर स्टोरेज इत्यादि) के अनुसार लॉग संदेशों को संसाधित कर सके। यह कमांड सुनिश्चित करता है कि लॉगिंग के लिए हमारे बफर का उपयोग किया जाता है। |
| logger.setLevel(logging.DEBUG) | संदेशों को लॉग करने के लिए न्यूनतम गंभीरता स्तर को परिभाषित करता है। उदाहरणों में, इसे इस पर सेट किया गया है डीबग, यह सुनिश्चित करते हुए कि कम गंभीर संदेशों सहित सभी संदेशों को पकड़ लिया गया है और बाद में निरीक्षण के लिए बफर कर दिया गया है। |
पायथन में त्रुटि पर हाल के लॉग को कुशलतापूर्वक कैप्चर करना
प्रस्तुत पहली स्क्रिप्ट एक कस्टम लॉगिंग हैंडलर का उपयोग करती है डेक पायथन से संरचना संग्रह मॉड्यूल. यह डेक एक रिंग बफ़र के रूप में कार्य करता है, जो हाल के लॉग संदेशों की एक निश्चित संख्या रखता है। हैंडलर इसे ओवरराइड करता है फेंकना विधि, जिसे हर बार लॉग जनरेट होने पर कहा जाता है। इस पद्धति में, प्रत्येक लॉग संदेश को स्वरूपित किया जाता है और फिर डेक में जोड़ा जाता है। क्योंकि डेक की अधिकतम लंबाई होती है, क्षमता तक पहुंचने पर यह स्वचालित रूप से सबसे पुराने संदेशों को हटा देता है। यह समाधान सबसे हाल के लॉग को कुशलतापूर्वक ट्रैक करता है, यह सुनिश्चित करता है कि चेकर मॉड्यूल से अत्यधिक डिबग संदेश लॉग आउटपुट को प्रभावित नहीं करते हैं, लेकिन रनर मॉड्यूल में कोई त्रुटि होने पर भी उपलब्ध रहते हैं।
जब रनर मॉड्यूल में कोई त्रुटि पाई जाती है, तो स्क्रिप्ट एक कस्टम विधि को कॉल करती है get_logs डेक में संग्रहीत लॉग संदेशों को पुनः प्राप्त करने के लिए। यह आपको चेकर से उन लॉग संदेशों का निरीक्षण करने की अनुमति देता है जो त्रुटि से ठीक पहले थे। इस दृष्टिकोण के पीछे विचार यह है कि लॉग संदेश लॉग वर्बोसिटी और उपयोगिता के बीच संतुलन बनाए रखते हुए समस्या निवारण के लिए महत्वपूर्ण संदर्भ प्रदान करते हैं। यह पायथन में सर्कुलर लॉग बफर बनाने का एक सरल और प्रभावी तरीका है पश्व-अनुरेखन सुविधा C++ की spdlog लाइब्रेरी में मिली।
दूसरा समाधान बिल्ट-इन का उपयोग करता है मेमोरीहैंडलर पायथन के लॉगिंग मॉड्यूल से। मेमोरीहैंडलर मेमोरी में लॉग संदेशों को बफ़र करके और उन्हें केवल तभी फ्लश करके काम करता है जब कोई विशिष्ट लॉग स्तर सामने आता है, जैसे कि गलती. इस मामले में, हैंडलर को 10 लॉग संदेशों तक बफ़र करने और कोई त्रुटि होने पर उन्हें फ्लश करने के लिए कॉन्फ़िगर किया गया है। यह दृष्टिकोण रिंग बफर तकनीक के समान है लेकिन पायथन के मौजूदा लॉगिंग इंफ्रास्ट्रक्चर का उपयोग करता है, जो कार्यान्वयन को सरल बनाता है। मेमोरीहैंडलर उन परिदृश्यों के लिए आदर्श है जहां आप लॉग संदेशों का एक स्नैपशॉट कैप्चर करना चाहते हैं जो सामान्य संचालन के दौरान लॉग को अव्यवस्थित किए बिना त्रुटि का कारण बनता है।
दोनों समाधान प्रदर्शन के लिए अनुकूलित हैं और मेमोरी खपत को सीमित करने के लिए डिज़ाइन किए गए हैं। मेमोरी में संग्रहीत लॉग की संख्या को सीमित करके और केवल महत्वपूर्ण घटनाओं के दौरान बफर को फ्लश करके, वे स्वच्छ, प्रबंधनीय लॉग बनाए रखने में मदद करते हैं। यह डेवलपर्स को बड़ी मात्रा में अनावश्यक जानकारी को छांटने के बजाय वास्तविक त्रुटि को डीबग करने पर ध्यान केंद्रित करने की अनुमति देता है। प्रत्येक स्क्रिप्ट को केवल संबंधित लॉगर में कस्टम या मेमोरी हैंडलर जोड़कर मौजूदा पायथन लॉगिंग कॉन्फ़िगरेशन में आसानी से एकीकृत किया जा सकता है, और दोनों विभिन्न लॉग प्रारूपों और स्तरों के लिए अनुकूलित होने के लिए पर्याप्त लचीले हैं।
कस्टम रिंग बफ़र के साथ त्रुटि पर हाल के पायथन लॉगिंग संदेशों को कैप्चर करना
पायथन लॉगिंग मॉड्यूल - कस्टम रिंग बफर कार्यान्वयन
# Approach 1: Using a custom handler with a deque (ring buffer) to store recent logsimport loggingfrom collections import deque# Custom log handler to store recent log messagesclass BufferingHandler(logging.Handler):def __init__(self, capacity):super().__init__()self.log_buffer = deque(maxlen=capacity) # Circular bufferdef emit(self, record):self.log_buffer.append(self.format(record)) # Store formatted log messagesdef get_logs(self):return list(self.log_buffer) # Retrieve recent log messages# Configure logging with custom handlerlogger = logging.getLogger('checker')buffer_handler = BufferingHandler(capacity=10)logger.addHandler(buffer_handler)logger.setLevel(logging.DEBUG)# Example log generationfor i in range(20):logger.debug(f"Debug message {i}")# Simulate an error in runner and print the last few log messagestry:1 / 0 # Simulate errorexcept ZeroDivisionError:print("Error occurred, recent log messages:")for log in buffer_handler.get_logs():print(log)
पायथन में बफ़र्ड लॉगिंग के लिए मेमोरीहैंडलर का उपयोग करना
पायथन लॉगिंग मॉड्यूल - मेमोरीहैंडलर दृष्टिकोण
# Approach 2: Using MemoryHandler to buffer log messagesimport logging# MemoryHandler buffers log records in memory and flushes them when conditions are metmemory_handler = logging.handlers.MemoryHandler(capacity=10, flushLevel=logging.ERROR)# Configuring logging with a stream handler for outputstream_handler = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')stream_handler.setFormatter(formatter)# Attach the memory handler and stream handler to loggerlogger = logging.getLogger('checker')logger.setLevel(logging.DEBUG)memory_handler.setTarget(stream_handler)logger.addHandler(memory_handler)# Generating some debug messagesfor i in range(15):logger.debug(f"Debug message {i}")# Simulate an error that will trigger the buffer to flushlogger.error("An error occurred in runner")# The memory handler will now flush its buffer and show the last 10 messages
पायथन में लॉग संदेशों को कैप्चर करने के वैकल्पिक तरीकों की खोज
पायथन में हाल के लॉग संदेशों को कैप्चर करने के लिए एक अन्य दृष्टिकोण में तृतीय-पक्ष लाइब्रेरी का उपयोग करना शामिल है लोगुरू. पायथन के अंतर्निर्मित लॉगिंग मॉड्यूल के विपरीत, लोगुरू अधिक लचीला और उपयोगकर्ता के अनुकूल इंटरफ़ेस प्रदान करता है। इसमें लॉग को घुमाने, लॉग स्तरों को फ़िल्टर करने और विभिन्न प्रारूपों में लॉग कैप्चर करने के लिए अंतर्निहित समर्थन शामिल है। अत्यधिक लॉग उत्पन्न करने वाले अनुप्रयोगों के साथ काम करते समय यह लाइब्रेरी विशेष रूप से उपयोगी हो सकती है, क्योंकि यह लॉग प्रबंधन को सरल बनाती है और यह सुनिश्चित करती है कि त्रुटि प्रबंधन के दौरान महत्वपूर्ण संदेश छूट न जाएं।
लॉगरू लॉग सिंक स्थापित करने की अनुमति देता है, जिसे मेमोरी, फ़ाइलों या यहां तक कि बाहरी सेवाओं में लॉग स्टोर करने के लिए अनुकूलित किया जा सकता है। आप कस्टम सिंक का उपयोग करके एक अस्थायी इन-मेमोरी बफर बना सकते हैं, जिसे त्रुटि आने पर फ्लश किया जा सकता है। यह लोगुरू को उन लोगों के लिए एक शक्तिशाली विकल्प बनाता है जो मानक लॉगिंग लाइब्रेरी की तरह हैंडलर को मैन्युअल रूप से कॉन्फ़िगर किए बिना अपने लॉगिंग सिस्टम पर अधिक नियंत्रण चाहते हैं।
Loguru का एक अन्य लाभ यह है कि यह मौजूदा लॉगिंग सिस्टम के साथ आसान एकीकरण की अनुमति देता है, जिसका अर्थ है कि आप अपने संपूर्ण लॉगिंग सेटअप को ओवरहाल किए बिना Loguru पर स्विच कर सकते हैं। जटिल अनुप्रयोगों से निपटने के दौरान यह विशेष रूप से सहायक हो सकता है जहां प्रदर्शन और लॉग प्रबंधन महत्वपूर्ण हैं। अंततः, जबकि अधिकांश उपयोग के मामलों के लिए पायथन का लॉगिंग मॉड्यूल पर्याप्त है, लॉग संदेशों को प्रभावी ढंग से कैप्चर करने और प्रबंधित करने के लिए लोगुरू जैसी लाइब्रेरी की खोज अतिरिक्त लचीलापन और उपयोग में आसानी प्रदान करती है।
पायथन में लॉग संदेशों को कैप्चर करने के बारे में सामान्य प्रश्न
- मैं लॉग संदेश की शब्दाडंबरता को कैसे सीमित कर सकता हूँ?
- उपयोग logger.setLevel(logging.ERROR) डिबग और जानकारी जैसे कम गंभीरता वाले संदेशों को दबाने के लिए, केवल त्रुटियाँ दिखा रहा है।
- हाल के लॉग को मेमोरी में संग्रहीत करने का सबसे अच्छा तरीका क्या है?
- ए deque(maxlen=capacity) सबसे पुरानी प्रविष्टियों को स्वचालित रूप से हटाने के साथ, हाल के लॉग संदेशों को संग्रहीत करने के लिए उपयोग किया जा सकता है।
- कोई त्रुटि होने पर मैं बफ़र किए गए लॉग को कैसे फ़्लश करूँ?
- साथ MemoryHandler, लॉग को मेमोरी में संग्रहीत किया जाता है और एक निश्चित लॉग स्तर ट्रिगर होने पर फ्लश किया जाता है, जैसे flushLevel=logging.ERROR.
- पाइथॉन की लॉगिंग की तुलना में लोगुरू का उपयोग करने का क्या फायदा है?
- Loguru कम बॉयलरप्लेट कोड के साथ लॉग सेटअप को सरल बनाता है और आसान फ़िल्टरिंग और घूर्णन लॉग जैसी अधिक सहज सुविधाएँ प्रदान करता है।
- क्या मैं लोगो को मौजूदा लॉगिंग कॉन्फ़िगरेशन के साथ एकीकृत कर सकता हूँ?
- हां, लोगुरू डिफ़ॉल्ट लॉगिंग हैंडलर को प्रतिस्थापित करके पायथन के अंतर्निहित लॉगिंग सिस्टम के साथ आसानी से एकीकृत हो सकता है।
लॉग कैप्चर तकनीकों का सारांश
त्रुटि-प्रवण स्थितियों में, पायथन के लॉगिंग मॉड्यूल का कुशलतापूर्वक उपयोग करने से आउटपुट को अव्यवस्थित किए बिना हाल के लॉग संदेशों को कैप्चर करने में मदद मिलती है। कस्टम हैंडलर जैसे डेक और मेमोरीहैंडलर कोई त्रुटि होने पर महत्वपूर्ण संदेशों को संग्रहीत करने के बहुमुखी तरीके प्रदान करें।
ये समाधान उच्च वर्बोसिटी वाले मॉड्यूल में त्रुटियों को डीबग करने के लिए व्यावहारिक हैं, जिससे यह सुनिश्चित होता है कि डेवलपर्स के पास आवश्यक लॉग डेटा उपलब्ध है। जैसे तृतीय-पक्ष टूल को एकीकृत करके लोगुरू, और भी अधिक लचीलापन उपलब्ध है, जो न्यूनतम कॉन्फ़िगरेशन के साथ उन्नत लॉग प्रबंधन की पेशकश करता है।
पायथन लॉगिंग सॉल्यूशंस के लिए स्रोत और संदर्भ
- पायथन की व्याख्या डेक कार्यान्वयन और लॉगिंग में इसका उपयोग: पायथन दस्तावेज़ीकरण - संग्रह
- पायथन पर विवरण काटना लाइब्रेरी और मेमोरीहैंडलर: पायथन दस्तावेज़ीकरण - लॉगिंग
- का अवलोकन लोगुरू एक उन्नत पायथन लॉगिंग विकल्प के रूप में: लोगुरू दस्तावेज़ीकरण
- की तुलना एवं उपयोग spdlog बैकट्रेस समर्थन के लिए C++ में: एसपीडीलॉग गिटहब रिपॉजिटरी