आधुनिक सॉफ्टवेयर विकास के तेज़ गति वाले वातावरण में, कुशल डिबगिंग और सिस्टम मॉनिटरिंग के लिए प्रभावी लॉगिंग महत्वपूर्ण है। हालाँकि, लॉग आउटपुट में असंगत या गलत लाइन नंबर समस्या निवारण में समय लेने वाला बना सकते हैं। हाल ही में, मैंने पहचाना कि हमारी आंतरिक लॉगिंग उपयोगिता स्वयं को लॉग के स्रोत के रूप में रिपोर्ट कर रही थी। लॉग परिशुद्धता को बढ़ाने के लिए इस पर ध्यान देने की आवश्यकता है।
लॉग को संभालने के लिए कस्टम यूटिलिटी क्लास का उपयोग करते समय, यह खुद को लॉग के स्रोत के रूप में रिपोर्ट करना शुरू कर देगा, क्योंकि यूटिलिटी क्लास वह है जो अंततः वास्तविक लॉग फ्रेमवर्क को कॉल करता है (मेरे मामले में, यह SLF4J था , बैकएंड के रूप में Log4J2 के साथ)।
इसलिए, यदि उपयोगिता वर्ग को इंटरनललॉगर कहा जाता है, तो लॉग कुछ इस तरह दिखेगा:
2024-10-11T18:10:57,345 [finagle/netty4-6] (InternalLogger.java:34) INFO ...
यहां, रिपोर्ट की गई स्रोत फ़ाइल और लाइन नंबर लॉगिंग उपयोगिता के भीतर ही एक स्थान को इंगित करता है, न कि जहां एप्लिकेशन कोड में लॉग कॉल वास्तव में किया गया था। यह व्यवहार डिबगिंग और मुद्दों को शीघ्रता से इंगित करने में लॉग की प्रभावशीलता को कम करता है।
सबसे पहले मैंने लाइन नंबर की रिपोर्ट करने से पहले मैन्युअल रूप से स्टैक ट्रेस पर चलने और कुछ तत्वों को फ़िल्टर करने के बारे में सोचा। यह दृष्टिकोण बहुत महंगा होगा, और मैं हमारी लॉगिंग प्रक्रिया को धीमा नहीं करना चाहता।
सौभाग्य से, मैंने इस स्टैक ओवरफ़्लो उत्तर में पाया कि SLF4J LocationAwareLogger नामक एक इंटरफ़ेस प्रदान करता है, जिसे Log4J2 समर्थन करता है, इसलिए, हम केवल लॉग यूटिलिटी क्लास 'FQCN (पूरी तरह से योग्य क्लास नाम) पास करके उपयोगिता वर्ग को फ़िल्टर कर सकते हैं।
मेरी मूल उपयोगिता कक्षा कुछ इस तरह दिखती थी:
public class InternalLogger { private static final Logger LOG = LoggerFactory.getLogger(InternalLogger.class); public void log(EventLog eventLog) { //... get message and logLevel from eventLog switch (logLevel) { case DEBUG: LOG.debug(message); break; case WARN: LOG.warn(message);
इस समाधान के लिए, मैंने लॉगर क्लास FQCN घोषित किया और LocationAwareLogger के साथ लॉग इन करने के लिए एक निजी सहायक फ़ंक्शन जोड़ा:
private static final String LOGGER_UTIL_FQCN = InternalLogger.class.getName(); private void locationAwareLog(int level, String message) { ((LocationAwareLogger) LOG).log(null, LOGGER_UTIL_FQCN, level, message, null, null); }
और समर्थित होने पर इसे कॉल करने के लिए अपना पुराना कोड बदल दिया:
switch (logLevel) { case DEBUG: if (LOG instanceof LocationAwareLogger) { locationAwareLog(LocationAwareLogger.DEBUG_INT, message); } else { LOG.debug(message); } break; case WARN: if (LOG instanceof LocationAwareLogger) { locationAwareLog(LocationAwareLogger.WARN_INT, message); } else { LOG.warn(message); } //...
दुर्भाग्य से, SLF4J तर्क के रूप में स्तर प्रदान करने का कोई तरीका प्रदान नहीं करता है (यानी LOG.log(स्तर, संदेश))। यदि ऐसा होता, तो कोड थोड़ा कम क्रियात्मक होता।
इस परिवर्तन को लागू करने के बाद, लॉग अब कॉलर के लाइन नंबर की सटीक रिपोर्ट देते हैं, जिससे ट्रेसबिलिटी में काफी सुधार होता है:
2024-10-11T18:45:26,692 [finagle/netty4-6] (ActualLogic.java:1059) INFO ...
अंतर पर ध्यान दें: इंटरनललॉगर.जावा:34 बनाम एक्चुअललॉजिक.जावा:1059, जो एप्लिकेशन कोड के भीतर लॉग मूल के अधिक सटीक स्थान को इंगित करता है।
एसएलएफ4जे के लोकेशनएवेयरलॉगर को शामिल करके, मैंने हमारे लॉगिंग सिस्टम को भ्रम के स्रोत से एक सटीक डायग्नोस्टिक टूल में बदल दिया है। यह परिवर्तन लॉगिंग उपयोगिता के बजाय कॉल करने वाले के लाइन नंबर की सटीक रिपोर्टिंग को सक्षम बनाता है, जिससे समस्याओं का तेजी से और सटीक निदान करने की हमारी क्षमता में काफी वृद्धि होती है।
यह सुधार न केवल डिबगिंग को सुव्यवस्थित करता है बल्कि सॉफ़्टवेयर समस्याओं का समाधान करते समय प्रतिक्रिया समय को भी कम करता है।
समान चुनौतियों का सामना करने वाले डेवलपर्स को अपने लॉगिंग सिस्टम की प्रभावशीलता को बढ़ाने के लिए इस दृष्टिकोण पर विचार करना चाहिए। स्पष्ट और अधिक सटीक लॉग के साथ, वे एक बार अस्पष्ट डेटा को कार्रवाई योग्य अंतर्दृष्टि में बदल सकते हैं, जिससे परिचालन दक्षता और सॉफ़्टवेयर विश्वसनीयता दोनों में सुधार हो सकता है। आज के तेज़ गति वाले विकास परिदृश्य की चुनौतियों का सामना करने और उच्च गुणवत्ता वाले सॉफ़्टवेयर परिणाम सुनिश्चित करने के लिए अनुकूलित लॉगिंग महत्वपूर्ण है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3