2010-01-12 9 views
7

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

मैंने this question पर एक नज़र डाली जो मेरे समान ही है, लेकिन इससे मदद नहीं मिली।

मैंने देखा है तो वह ऐसा श्रीमती साथ this other question में किया:

MethodBase methodBase = new StackTrace().GetFrame(1).GetMethod(); 
this.log.Debug(methodBase.Name + " : " + message); 

इस के बाद से यह बाहर के बॉक्स log4net कार्यक्षमता का उपयोग नहीं कर रहा है आदर्श नहीं है।

मैं इस बारे में जानना चाहता हूं कि लोग टेंगेंट के लिए जाने से पहले और कुछ जटिल के साथ आने से पहले यह कैसे कर रहे हैं। किसी भी पॉइंटर्स (लिंक/संसाधन/नमूने) की सराहना की!

उत्तर

2

मैं आमतौर पर कुछ जोड़ने के इस ...

MethodBase.GetCurrentMethod().Name 

आप हमेशा कि (MethodBase) की तरह किसी भी पैरामीटर आप की जरूरत ले जाता है log4net के लिए एक आवरण बना सकते हैं (यह मैं की जरूरत है सभी कार्यक्षमता है)?

+1

धन्यवाद - मैं नीचे प्रकार और methodName गुजर से बचने के लिए चाहते हैं। – JohnIdol

4

लॉग 4नेट आपको इस विधि विधि जैसे उदाहरण के लिए विधि नाम तक पहुंचने की अनुमति देता है। यह सबसे तेज़ ऑपरेशन नहीं है लेकिन अगर आपको कुछ डीबग करने की ज़रूरत है तो आप इसका बहुत अच्छा इस्तेमाल कर सकते हैं। मेरा मानना ​​है कि आपका प्रश्न इस तथ्य के बारे में है कि यदि आप एक रैपर का उपयोग करते हैं तो log4net सही विधि नाम आउटपुट नहीं करेगा।

उस समस्या को हल करने के लिए आपको यह देखना होगा कि log4net ने ILog कार्यान्वयन कैसे लिखा था। यह मूल रूप से आंतरिक लॉग 4नेट लॉगर के चारों ओर एक रैपर है और इसलिए एक ही समस्या ILog कार्यान्वयन पर भी लागू होती है। मैंने मूल रूप से निम्नलिखित किया:

// define a field such as this 
private static readonly Type ThisDeclaringType = typeof(MyLogWrapper); 

// in constructor. Note: I use the internal Logger! 
this.Logger = LogManager.GetLogger(name).Logger; 

// I created a WriteLog method that calls the internal logger like this 
// you will need to translate to the internal log levels 
// message and ex are the items I want to log (ex can be null) 
this.Logger.Log(MyLogWrapper.ThisDeclaringType, log4netLevel, message, ex); 

जाहिर है कि कुछ चीजें अभी तक करने के लिए हैं, लेकिन महत्वपूर्ण बिंदुओं का उल्लेख किया गया है।

3

इस तरह अपने आवरण वर्ग बनाएं ...

public static class LogFourNet 
    { 
     // Define a static logger variable so that it references the 
     private static readonly ILog Log = LogManager.GetLogger(typeof(LogFourNet)); 

     static LogFourNet() 
     { 
      XmlConfigurator.Configure(
        new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); 
      Log.Info("Log4net is configured."); 
     } 

     public static void Info(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Info("[" + currentObj.GetType().Namespace + "." + 
        Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 

     public static void Debug(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Debug("[" + currentObj.GetType().Namespace + "." + 
         Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 

     public static void Error(object currentObj, string msg, [CallerLineNumber] int lineNumber = 0, 
      [CallerFilePath] string caller = "", [CallerMemberName] string memberName = "") 
     { 
      Log.Error("[" + currentObj.GetType().Namespace + "." + 
         Path.GetFileNameWithoutExtension(caller) + "." + memberName + ":" + lineNumber + "] - " + msg); 
     } 
    } 

निम्नलिखित तरीके से अपने log4net.config फ़ाइल कॉन्फ़िगर करें ...

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="logfile.log" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p - %m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> 
     <level value="ALL" /> 
     <appender-ref ref="FileAppender" /> 
    </root> 
    </log4net> 
</configuration> 

अब इस तरह के तरीकों से ऊपर का उपयोग करें ...

// need to pass this(current obj) as we want to log full class name 
LogFourNet.Debug(this, "started something from wrapper"); 

output: 
------- 
2017-02-04 15:38:37,549 [1] DEBUG [WebAPI_DI.Startup.Configuration:25] - started something from wrapper