2009-02-05 15 views
60

मैं रोलिंग लॉग फ़ाइल में लॉग इन लॉग संदेश लॉग करने के लिए log4net का उपयोग कर रहा हूं।log4net के साथ ट्रेस संदेशों को लॉग कैसे करें?

अब मैं उस लॉग फ़ाइल में System.Diagnostics.Trace से सभी ट्रेस संदेशों को पुनर्निर्देशित करता हूं। मैं इसे कैसे कॉन्फ़िगर कर सकता हूं? मैंने लॉग 4नेट दस्तावेज में इसके बारे में कुछ भी खोजने की कोशिश की, लेकिन सफलता के बिना। क्या यह सभी के लिए संभव है?

कारण मैं ऐसा करना चाहता हूं क्योंकि मुझे किसी तृतीय पक्ष लाइब्रेरी के ट्रेस संदेशों में रूचि है।

<log4net> 
    <appender name="R1" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\Logs\MyService.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <maxSizeRollBackups value="10" /> 
     <datePattern value="yyyyMMdd" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
</log4net> 

उत्तर

58

का उपयोग कर कोड में यह जोड़ना होगा रूण के सुझाव के अनुसार मैं जो उत्पादन log4net के लिए एक बुनियादी TraceListener कार्यान्वित:

public class Log4netTraceListener : System.Diagnostics.TraceListener 
{ 
    private readonly log4net.ILog _log; 

    public Log4netTraceListener() 
    { 
     _log = log4net.LogManager.GetLogger("System.Diagnostics.Redirection"); 
    } 

    public Log4netTraceListener(log4net.ILog log) 
    { 
     _log = log; 
    } 

    public override void Write(string message) 
    { 
     if (_log != null) 
     { 
      _log.Debug(message); 
     } 
    } 

    public override void WriteLine(string message) 
    { 
     if (_log != null) 
     { 
      _log.Debug(message); 
     } 
    } 
} 
+9

+1। अगर मैं TraceAppender को लिखने के लिए लॉग 4नेट भी सेट अप करता हूं तो मुझे सावधान रहना होगा। मैंने वास्तव में इसका परीक्षण नहीं किया है, लेकिन आप ऐसी परिस्थिति में समाप्त हो सकते हैं जहां ट्रेस लॉग 4नेट पर लिख रहा है और log4net ट्रेस पर लिख रहा है जिसके परिणामस्वरूप अनंत लूप होता है। उदाहरण के लिए ऊपर दिए गए उदाहरण को देखते हुए, आप लॉग इन 'सिस्टम। डायग्नोस्टिक्स.रेडरेक्शन' के लिए परिशिष्ट में TraceAppender को शामिल नहीं कर सकते हैं। – Jimit

+0

क्योंकि यह एक ट्रेस श्रोता है क्योंकि आपको यह सुनिश्चित करने के लिए लिखने के तरीकों में प्रयास/प्रयास ब्लॉक लागू करना चाहिए कि एक लिखित प्रयास मेजबान को कभी विफल नहीं करेगा। मैंने कोड संपादन सबमिट किए जो ऑब्जेक्ट निर्माण को सही करते हैं और कोड को और अधिक पठनीय और असफल होने की संभावना कम करते हैं। –

+0

@ जेवायएल यहाँ [उस ब्लॉग पोस्ट के लिए एक अद्यतन लिंक] है (http://www.geertvanhorrik.com/2010/06/18/log4net-tracelistener/)। हालांकि ऐसा लगता है कि कुछ चीजें इस कदम में खो गई हैं। उस पोस्ट में एक्सएमएल कोड अब गलत है और Log4netTraceListener का लिंक काम नहीं करता है। उम्मीद है कि लेखक कोड को पुनर्जीवित करेगा। –

23

मुझे नहीं पता कि log4net इसका समर्थन करता है या नहीं, लेकिन आप इसे अपने स्वयं के ट्रेस श्रोता को कार्यान्वित कर सकते हैं।

ट्रेस लिस्टनर में बहुत सी विधि नहीं हैं जिन्हें कार्यान्वित करने की आवश्यकता है और आप जो करना चाहते हैं वह मान को log4net पर अग्रेषित करना है, इसलिए यह करना आसान होना चाहिए।

एक श्रोता कस्टम ट्रेस आप या तो होगा जोड़ने के लिए अपने app.config/web.config को संशोधित करने या आप Trace.Listeners.Add(new Log4NetTraceListener());

1

ऊपर जवाब के अनुसार, वहाँ एक कार्यान्वयन यहाँ है (इस लिंक परतदार है, लेकिन मैं स्रोत कोड मिला):

https://code.google.com/archive/p/cavity/

लॉगलॉग कक्षा से जारी आंतरिक लॉग 4नेट ट्रेस के मुद्दे (जिसे पिछले उत्तर में टिप्पणियों में वर्णित किया गया है) के साथ गंभीरता से निपटने के लिए, मैंने इस वर्ग को स्टैक फ्रेम का निरीक्षण करके ट्रेस का स्रोत बताया है (जो इस कार्यान्वयन ने किया था अभी भी समस्या से ऊपर टिप्पणी में वर्णित पैदा करेगा एक TraceAppender का उपयोग

public override void WriteLine(object o, string category) 
    { 
     // hack to prevent log4nets own diagnostic trace getting fed back 
     var method = GetTracingStackFrame(new StackTrace()).GetMethod(); 
     var declaringType = method.DeclaringType; 
     if (declaringType == typeof(LogLog)) 
     { 
      return; 
     } 
     /* rest of method writes to log4net */ 
    } 

: पहले से ही) और उन का पता लगाने संदेशों की अनदेखी। उपरोक्त उत्तर के लिए

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