तो मेरी समस्या लॉगिंग के बारे में है, और लॉग स्टेटमेंट को कैसे संभालना है जो आपके कोड और आपके रनटाइम व्यवहार पर प्रभाव डाल सकता है।लॉगिंग सही
लॉग फाइलें ... प्रत्येक प्रोग्राम को प्रोपर समस्या हल करने के लिए उन्हें लिखना चाहिए, लेकिन यह सही तरीके से कैसे करें?
अधिकांश लॉग-स्टेटमेंट प्राप्त करने के लिए महंगे हैं क्योंकि उन्हें उपयोगी जानकारी प्रदान करनी चाहिए और वे हमेशा बनाए जाते हैं, यहां तक कि लॉगिंग पूरी तरह से अक्षम होती है।
लॉगिंग xmls, inode या कुछ सेटिंग्स आदि द्वारा कॉन्फ़िगर किया जा सकता है लेकिन यह स्ट्रिंग बिल्डिंग समस्या को हल नहीं करता है।
उदाहरण के लिए निम्नलिखित कोड हमेशा एक विशाल आलसी लोड पेड़ लोड कर रहा है जो सामान्य निष्पादन के दौरान कभी भी लोड नहीं किया जाएगा।
पूरे वृक्ष केवल इस प्रवेश बयान के लिए बनाई गई है लॉग फ़ाइल में प्रदर्शित करने के लिए
(ठीक है, मुझे पता है ..., लेकिन यह सिर्फ सभी जटिल प्रवेश तरीकों कि में मौजूद है के लिए एक स्थानापन्न है ज्यादातर कार्यक्रमों जो सामान्य रिहाई निष्पादन) के दौरान कभी नहीं निष्पादित किया जाना चाहिए
public void SomeMethod(){
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
विधि someObject.GetHeavyDescriptionFromLazyTree()
हमेशा भले ही शुरू हो जाती है लॉगिंग बंद है, इसलिए वहाँ की तरह इस समस्या के लिए कुछ सामान्य समाधान हैं:
public void SomeMethod(){
#if DEBUG
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
#endif
}
public void SomeMethod(){
if(logger.DoLogDebug())
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
मुझे लगता है कि यह स्पष्ट है कि #if DEBUG
कंपाइलर ध्वज उत्पादक कोड के लिए कोई समाधान नहीं है। यदि मैं logger.DoLogDebug()
का उपयोग करता हूं तो लॉगिंग सक्षम होने पर जांचने के लिए अत्यधिक कोड होगा ... इसलिए यह समाधान भी नहीं हो सकता है।
मैंने सोचा था कि ConditionalAttribute
मदद कर सकता है लेकिन यह भी संकलक झंडे करने के लिए बाध्य है और यह GetHeavyDescriptionFromLazyTree
[Conditional("DEBUG")]
public void Debug(string debugMessage)
{
Console.WriteLine(debugMessage);
}
करने के लिए कॉल तो मैं एक प्रवेश समाधान के लिए देख रहा हूँ निष्क्रिय नहीं है जो
- डीबग कथन
- के साथ मेरे स्रोत कोड को अत्यधिक बाधित नहीं कर रहा है जहां रनटाइम के दौरान लॉगिंग स्तर तय किया जाता है संकलन समय पर नहीं
- जहां बयान केवल हल कर रहे हैं यदि आवश्यक (LogLevel> definedLogLevel)
सर्वश्रेष्ठ उत्तर ;-)
संपादित के लिए अतिरिक्त loglines: मैं .NET 2.0 में
आपके समाधान के लिए धन्यवाद, यह बहुत अच्छा लगता है लेकिन मैं भूल गया, इसे .NET 2.0 :-( – oberfreak
@oberfreak के साथ हल किया जाना चाहिए, मुझे लगता है कि मानक 'अगर' चेक आपकी सबसे अच्छी शर्त है; उम्मीद है कि आप लॉगिंग बहुत महंगा नहीं है। –
अपहरण .NET 2.0 के साथ _not_ क्यों काम नहीं करना चाहिए? मैं यह हमेशा VS.NET 2010 और .NET 2.0 के साथ लक्ष्य मंच के रूप में करता हूं। –