Log4net तर्क LogManager.GetLogger के लिए


98

अधिकांश log4net उदाहरणों को ऐसा करके वर्ग के लिए लकड़हारा क्यों मिलता है:

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

केवल पासिंग टाइपोफ (MyClass) के बजाय:

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

क्या ऐसा करने का कोई अन्य कारण है, इस तथ्य के साथ कि पहले विकल्प के लिए आपको एक विशिष्ट वर्ग नाम लिखने की आवश्यकता नहीं है?

जवाबों:


93

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

आधिकारिक उत्तर के लिए, देखें: मैं एक स्थिर ब्लॉक में एक वर्ग का पूरी तरह से योग्य नाम कैसे प्राप्त करूं? पर log4net पूछे जाने वाले प्रश्न


ठीक है कि इसे साफ करता है, उस लिंक के लिए धन्यवाद, मैंने पहले नहीं देखा था
एंडी व्हाइट

यह उतना ही पुराना है जितना यह हो जाता है, लेकिन मेरे जवाब पर एक नजर डालते हैं कि आप अभी भी बॉयलर कोड के रूप में पेस्ट करते हैं :)
Noctis

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

1
आप जितना सोचते हैं उतना धीमा नहीं कर रहे हैं, यह एक स्थिर कॉल है इसलिए आपके पास प्रति ऐप डोमेन प्रति एक आह्वान है, उदाहरण के लिए यदि आपके पास 300 कक्षाएं हैं, तो आपके पास अपने ऐप के जीवनकाल के लिए अधिकतम 300 कॉल हैं
पॉल हैचर

टाइप नाम प्राप्त करने के लिए प्रतिबिंब का उपयोग करने का कोई मतलब नहीं है, और कॉपी / अतीत आलस्य है और आपको एक प्रदर्शन हिट मिलता है, इसलिए सिर्फ नाम नहीं मिला !?
मेत्तुस

8

मैं एक NLog उपयोगकर्ता हूं, और आमतौर पर यह बात उबलती है:

var _logger = LogManager.GetCurrentClassLogger();

यह थोड़ा अजीब लग रहा था कि आपको Log4Net में प्रतिबिंब के माध्यम से जाने की ज़रूरत है, इसलिए मुझे NLog स्रोत कोड में एक नज़र आया, और लो और निहारना, यह वही है जो वे आपके लिए करते हैं:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

मुझे लगता है कि मैं अपने बॉयलर कोड के हिस्से के रूप में प्रतिबिंब को चिपकाने के बजाय एक विस्तार या स्थिर विधि के रूप में Log4Net के लिए कुछ ऐसा ही लिखूंगा :)


7

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


3

मुझे लगता है कि इसका कारण यह है, कि आपको .DeclaringType()विधि का उपयोग करके रनटाइम का प्रकार मिलता है । आप एक बेस क्लास में लकड़हारे का उपयोग कर सकते हैं और फिर भी लॉगर्स आउटपुट में आपकी वस्तु का वास्तविक प्रकार देख सकते हैं। यह जांच को और अधिक ठोस बनाता है।


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