2010-04-04 11 views
5
try 
{ 
    // Code 
} 
catch (Exception ex) 
{ 
    Logger.Log("Message", ex); 
    throw; 
} 

लाइब्रेरी के मामले में, क्या मुझे अपवाद भी लॉग करना चाहिए? क्या मुझे इसे फेंक देना चाहिए और एप्लिकेशन को लॉग इन करने की अनुमति देना चाहिए? मेरी चिंता यह है कि यदि मैं लाइब्रेरी में अपवाद लॉग करता हूं, तो कई डुप्लिकेट होंगे (क्योंकि लाइब्रेरी परत इसे लॉग करेगी, एप्लिकेशन लेयर इसे लॉग करेगा, और बीच में कुछ भी), लेकिन अगर मैं इसे लॉग इन नहीं करता लाइब्रेरी, बग को ट्रैक करना मुश्किल होगा। क्या इसके लिए कोई सर्वोत्तम प्रथा है?अपवाद लॉग इन कब करें?

उत्तर

3

मैं एक अपवाद नहीं लॉगूंगा कि मैं कुछ भी करने वाला नहीं था - यानी, अगर यह आपके उदाहरण में अपवाद हैंडलर से गुजर रहा है। जैसा कि आपने पहले ही उल्लेख किया है, यह बहुत शोर जोड़ता है जो जरूरी नहीं है। उस बिंदु पर लॉग इन करना बेहतर है जहां आप वास्तव में इसके बारे में कुछ कर रहे हैं, या, लाइब्रेरी के मामले में, सीमा पर जहां यह उपयोगकर्ता के कोड में संक्रमण करता है।

उसने कहा, मैं हमेशा उस बिंदु पर लॉग इन करने का प्रयास करता हूं जहां मैं अपवाद फेंक रहा हूं और अपवाद को ट्रिगर करने वाली स्थिति। अपवाद के कारण को पिन करने के लिए यह बहुत उपयोगी है; इसके अलावा, यदि आप जिस शर्त का सामना करते हैं, वह अपवाद फेंकने के लिए पर्याप्त बुरा है, तो मैं कहूंगा कि यह प्रोसेसर समय को 'क्यों' लॉग आउट करने में भी खर्च करता है।

1

आपको इसे लॉग इन करना चाहिए और इसे फेंकना चाहिए ताकि एप्लिकेशन को लॉग इन करने के लिए यह उपलब्ध हो। विशेष रूप से यदि यह एक लाइब्रेरी है, तो आपको इसे लॉग करना चाहिए, क्योंकि नहीं मानना ​​चाहिए कि एप्लिकेशन निश्चित रूप से लॉग इन करेगा! (यह हो सकता है या नहीं)।

2

मैं उच्चतम स्तर के क्लाइंट पर लॉगिंग छोड़ना पसंद करता हूं, या लाइब्रेरी को टेक्स्टवाइटर प्रदान करके संभावित रूप से लॉगिंग को सक्षम/अक्षम करने की अनुमति देता हूं, जिस पर लाइब्रेरी को चलने के मामले में अपनी त्रुटियों/आउटपुट को लॉग इन करना चाहिए ऐसे माहौल में जहां इसे अपने सामान्य लॉग पर लिखने की अनुमति नहीं है।

कारण मैं उच्च स्तर पर लॉग इन करना पसंद करता हूं यह है कि उच्च स्तरों में अधिक संदर्भ जानकारी होती है, और इन त्रुटियों की रिपोर्ट/लॉग करने के लिए और अधिक उचित तरीके जान सकते हैं। चूंकि अपवादों में इन दिनों किसी भी तरह की स्टैक ट्रेस जानकारी होती है, इसलिए मुझे नहीं लगता कि अपवाद होने पर तुरंत लॉगिंग करके आपको बहुत कुछ मिलता है। आपको अपवादों के बारे में सावधान रहना होगा जो अन्य प्रकार के अपवादों में परिवर्तित हो जाते हैं, हालांकि, अगर आप किसी त्रुटि के स्रोत के बारे में सारी जानकारी रखने के लिए अपवादों को परिवर्तित कर रहे हैं, तो इनर अपवाद को लगातार परिवर्तित कर रहे हैं।

संपादित करें: बेशक यह दर्शन केवल उन वातावरणों में काम करता है जहां मेरा अन्य दर्शन का पालन किया जाता है: अपवादों को कभी अनदेखा न करें। यदि क्लाइंट या कुछ इंटरमीडिएट परत अपवाद फेंक रही है, तो आपको अन्य समस्याएं हैं और संभवतः क्लाइंट गैर जिम्मेदार होने पर उत्पन्न होने वाले कुछ आउटपुट पर आपके अपवाद लॉग को कम से कम डिफ़ॉल्ट करने की आवश्यकता होगी।

1

लॉग अपवाद भी एप्लिकेशन को डीबग करने का एक तरीका हो सकता है।

1

log4net का उपयोग करें। गंभीरता से।

ऐसी मानक और सर्वव्यापी पुस्तकालय का उपयोग करके आपको उन लोगों से मार्गदर्शन मिलता है जिन्होंने इस समस्या के बारे में सोचने में काफी समय लगाया है। समाधान यह है कि अधिकांश लॉगिंग पुस्तकालयों में लॉगिंग के कई स्तर होते हैं।

उदाहरण के लिए log4net में मैं

ILog log = LogManager.GetLogger("some logger"); 
log.Debug("some debugging info"); 
log.Info("some message meaningful in the domain"); 
log.Warn("something might be occurring that merits your attention"); 
log.Error("Everything just went to hell") 

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

मुझे लगता है कि आप जो वर्णन कर रहे हैं वह "डीबग" लॉग स्तर के नीचे स्पष्ट रूप से गिरता है।

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

तो सर्वोत्तम प्रथाओं:

  1. उपयोग विभिन्न प्रवेश स्तर।
  2. अपना खुद का लॉगिंग ढांचा रोल न करें, log4net (जो वास्तव में इस दिन और उम्र काफी मानक है) या कम से कम माइक्रोसॉफ्ट के entlib logging block पर उपयोग करें।
संबंधित मुद्दे