किसी एप्लिकेशन पर स्थिर लॉगिंग विधियों का उपयोग करने के बजाय एक लॉगर ऑब्जेक्ट क्यों बनाएं?


14

रेल आवेदन पर एक सरल रूबी का उदाहरण लेते हुए। यह Loggerएप्लिकेशन लोड प्रक्रिया के दौरान एक वस्तु बनाता है :

# in environment.rb
config.logger = Logger.new(<STDOUT | file | whatever>)

# and in our application we use this object
logger.warn "This process is taking too long to process. Optimization needed."

मेरा सवाल यह है कि हम लॉगिंग के लिए क्लास मेथड (या स्टैटिक मेथड) का इस्तेमाल क्यों नहीं करते? Logger.warnसे अधिक नहीं होगा Logger.new.warn? या कम से कम Logger.warnसहज लगता है Logger.new.warn

यहां तक ​​कि अगर Logger.newएक सिंगलटन ऑब्जेक्ट है, तो यह क्या लाभ प्रदान करता है?

जवाबों:


17

यहाँ एक उदाहरण है जो जावा का उपयोग करता है। जब से मैंने log4j का उपयोग किया है, तब से कुछ समय हो गया है, लेकिन मुझे जो याद है, उससे पूरा log4j लॉगिंग टूल एक XML फ़ाइल से प्रारंभ हो जाएगा। XML फ़ाइल में विभिन्न कॉन्फ़िगरेशन (जहाँ आप लिखते हैं, किस स्तर पर लिखे गए हैं, आदि) के साथ कई लॉगर्स हो सकते हैं। तो, इस मामले में आपके पास लकड़हारा स्थिर विधियों के बजाय लकड़हारा वस्तुएं होंगी ताकि यह निर्दिष्ट किया जा सके कि आप किस लकड़हारे को आमंत्रित करना चाहते हैं। अर्थात।

Logger logger = Logger.get("Network");

नेटवर्क कनेक्टिविटी, गिराए गए पैकेट, आदि से संबंधित चीजों को लॉग करेगा, या

Logger logger = Logger.get("Application");

जो आपके व्यापार तर्क / आवेदन से संबंधित चीजों को लॉग करेगा। कम से कम log4j के साथ आप यह भी कॉन्फ़िगर कर सकते हैं कि कौन से लॉग स्तर वास्तव में लिखे गए हैं (जानकारी, ट्रेस, चेतावनी, त्रुटि, डिबग डिफ़ॉल्ट स्तर उपलब्ध है)।

यदि आपके पास स्थैतिक विधियां हैं, तो आप जो सबसे अच्छा कर सकते हैं, वह एकल लकड़हारा कॉन्फ़िगर है जो मानक आउट, एक फ़ाइल आदि के लिए इंगित करेगा, लेकिन आपके द्वारा लॉग किया गया सब कुछ उसी स्थान पर जाएगा। लकड़हारा वस्तुओं के साथ, इसे बनाना आसान है इसलिए आपकी लॉगिंग जानकारी कई फ़ाइलों में फैल गई है।


धन्यवाद। यह समझने में भी मदद करता है कि स्थैतिक तरीकों का उपयोग कब किया जाए।
हर्ष गुप्ता

2
हालांकि, मैं अपनी लॉगिंग करने के लिए किसी ऑब्जेक्ट को इंस्टेंट करना पसंद करता हूं, जैसा कि यहां दिखाया गया है कि यह बहुत सामान्य है (मैं इसे बेहतर कहूंगा) इसे हर विधि कॉल में पारित करने के बजाय इसे सांख्यिकीय रूप से एक्सेस करना है। लॉगिंग प्रकृति में सिर्फ वैश्विक प्रकार है।
चाड शाउगिन्स

यह भी ध्यान दें कि कई बार ऐसा होता है जिसमें हम लकड़हारे को कॉन्फ़िगर करके (या कुछ इंटरफ़ेस का कार्यान्वयन प्रदान करके और उस लकड़हारे को प्रदान करना चाहते हैं) कॉन्फ़िगर करना चाहते हैं। इसका उपयोग लॉगिंग डेस्टिनेशन को बदलने के लिए कुछ करने के लिए किया जाएगा। जैसा कि @ChadSchouggins में बताया गया है, आप संभवतः विशिष्ट उदाहरण को स्थिर बना देंगे।
कैट

2

Logger.new एक ऐसी फैक्ट्री है, जहाँ पर परिणाम का उपयोग किया जाएगा (वर्ग / फ़ाइल का नाम)।

कॉन्फ़िगरेशन फ़ाइलों में आप फिर से तय कर सकते हैं कि परियोजना को फिर से शुरू किए बिना कार्यक्रम के कुछ हिस्सों के लिए लॉगिंग नहीं करने के लिए किस स्तर पर लॉग इन करें।

इस प्रकार आप रिलीज़ बिल्ड के लिए सभी लेकिन उच्च-स्तरीय लॉगिंग (त्रुटियों) को अक्षम कर सकते हैं और केवल उन भागों के लिए निम्नतम स्तर को सक्रिय कर सकते हैं जिन्हें आप डीबग कर रहे हैं।


2

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

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

चर्चा के तहत स्थैतिक विधि के आह्वान पर DI का उपयोग करने का लाभ निश्चित रूप से परीक्षण से परे है। विचार करें कि क्या होगा यदि आप अपने सिस्टम में दो अलग-अलग लॉगर रखना चाहते हैं, और मौजूदा कोड को संपादित किए बिना, ऑब्जेक्ट ग्राफ के कॉन्फ़िगरेशन के माध्यम से एप्लिकेशन व्यवहार को बदलने का विकल्प।

कुल मिलाकर, मेरा सुझाव है कि आप DI दृष्टिकोण की कोशिश करें, ताकि आपको बाद में अपना कोड अप्राप्य और अनिर्दिष्ट न लगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.