2011-02-13 23 views
9

ठीक है, तो मैं एनएलओजी देख रहा हूं। उपयोग के आधार पर, मेरा आवेदन लॉगिंग ढांचे से बंधेगा। इसका समाधान कैसे किया जा सकता है?मेरा लॉगिंग ढांचा हमेशा मेरे आवेदन से जुड़ा हुआ है!

इसके अलावा, जब एनएलओजी का उपयोग करते हैं, तो मुझे इस ढांचे का उपयोग कर रहे प्रत्येक वर्ग के लिए बहुत अधिक monkey-code लिखना होगा। क्या यह एक स्थिर वर्ग बनाने और मेरे आवेदन में कहीं से भी इसे एक्सेस करने का एक अच्छा अभ्यास है?

उदाहरण:

//the monkey code 
private static Logger logger = LogManager.GetCurrentClassLogger(); 

//the coupling. 
logger.Log(/*...*/); 

उत्तर

7
  1. अपनी खुद की प्रवेश इंटरफ़ेस बनाएँ:

    public interface IMyOwnLogger { 
        void Log(string message); 
    } 
    
  2. बनाएं कार्यान्वयन:

    public class NLogLogger : IMyOwnLogger { 
        void Log(string message) { 
         StackFrame frame = new StackFrame(1, false); 
         Logger logger = LogManager.GetLogger(frame.GetMethod().DeclaringType.FullName); 
         logger.Log(/*...*/); 
        } 
    } 
    
  3. बाइंड में NLogLogger को IMyOwnLogger अपने आईओसी कंटेनर।

  4. जहां आवश्यक हो इंजेक्ट करें (या IOC.Get<IMyOwnLogger>() का उपयोग करें)।

संपादित करें:

IDSA बुला वर्ग खो के बारे में एक टिप्पणी की। याद रखें कि आप हमेशा स्टैक ट्रेस का उपयोग कर सकते हैं:

var method = (new StackTrace()).GetFrame(1).GetMethod() 

और वहां से कॉलिंग क्लास निकालें।

संपादित करें:

इस तरह NLog में GetCurrentClassLogger की तरह लग रहा है, तो हमारी कक्षा में StackTrace का उपयोग करके अतिरिक्त भूमि के ऊपर का निर्माण नहीं करता:

[MethodImpl(MethodImplOptions.NoInlining)] 
public static Logger GetCurrentClassLogger() 
{ 
    #if SILVERLIGHT 
    StackFrame frame = new StackTrace().GetFrame(1); 
    #else 
    StackFrame frame = new StackFrame(1, false); 
    #endif 

    return globalFactory.GetLogger(frame.GetMethod().DeclaringType.FullName); 
} 
+1

आपने अपनी कक्षा घोषणा में इंटरफ़ेस खो दिया है। इसके अलावा यह बेहतर होगा 'MyOwnLogger' ने' लॉगर 'उदाहरण को कन्स्ट्रक्टर परम के रूप में स्वीकार किया - यह है कि DI कैसे काम करता है। – zerkms

+0

मुझे कोई बात नहीं है LogManager.GetCurrentClassLogger यहां समझ में आता है: यह MyOwnLogger के लिए बनाया जाएगा, लेकिन असली जगह के लिए नहीं जहां लॉगिंग को – SiberianGuy

+0

@zerkms कहा जाता है: धन्यवाद। मैंने इंटरफ़ेस जोड़ा है। 'NLogLogger' कक्षा NLog का उपयोग करके IMyOwnLogger कार्यान्वयन है, इसलिए इसे कन्स्ट्रक्टर में लॉगर नहीं लेना पड़ता है। – LukLed

2

व्यक्तिगत रूप से, मैं करने के लिए कोई प्रवेश ढांचे बांधने से बचने मेरा कोड TraceSource से instrument मेरा कोड का उपयोग कर। मैं फिर रनटाइम पर आउटपुट का पता लगाने के लिए "सुनना" करने के लिए लॉगिंग फ्रेमवर्क (आमतौर पर एंटरप्राइज़ लाइब्रेरी के लॉगिंग एप्लिकेशन ब्लॉक) का उपयोग करता हूं और उस जानकारी के साथ जो कुछ भी आवश्यक है, करता हूं। (यानी डेटाबेस में लिखें, ईमेल भेजें, आदि)

+0

इस तरह का प्रदर्शन क्या है? –

+0

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

+0

मैं यह भी इंगित करता हूं कि माइक्रोसॉफ्ट उपकरण ट्रेसिंग का उपयोग कर अपने स्वयं के वर्ग पुस्तकालयों का उपयोग करता है। इसका एक प्रमुख उदाहरण डब्ल्यूसीएफ (विंडोज संचार फाउंडेशन) है। आप इसके बारे में अधिक पढ़ सकते हैं [यहां] (http://msdn.microsoft.com/en-us/library/ms733025.aspx) –

संबंधित मुद्दे