2011-06-16 10 views
7

बस लॉग 4नेट का उपयोग करना शुरू कर दिया और कॉन्फ़िगर और लॉगर पदानुक्रम के आसपास अपना सिर प्राप्त करने का प्रयास किया। क्या यह पदानुक्रम नामस्थान या कक्षा और विधि/फ़ंक्शन पदानुक्रम पर आधारित है?प्रति विधि अलग-अलग एपेंडर

चलें कहते हैं कि मैं निम्नलिखित वर्ग संरचना है ...

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 

    public void Method1() 
    { 
    log4net.info("message"); 
    } 

    public void Method2() 
    { 
    log4net.info("message"); 
    } 

} 

एक appender और करने के लिए विधि 2 में log4net.info उपयोग करने के लिए Method1 में log4net.info के लिए config में सेटअप करने के लिए यह संभव है एक और ऐपेंडर का उपयोग करें, भले ही वे एक ही प्रकार के हैं SmtpAppender। यदि ऐसा है तो कॉन्फ़िगर कैसे देखेंगे। यहां मेरा पहला प्रयास है।

<appender name="SMTP1" type="log4net.Appender.SMTPAppender"> 
</appender> 
<appender name="SMTP2" type="log4net.Appender.SMTPAppender"> 
</appender> 


<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

उत्तर

6

पदानुक्रम "नाम" पर आधारित है। इसका क्या मतलब है?
ठीक है, आप अपने लॉगर xml (जैसे Foo.Bar) में एक नामस्थान निर्दिष्ट कर सकते हैं और उसके बाद GetLogger विधि का उपयोग कर उस नामस्थान में कक्षा के लिए लॉगर प्राप्त कर सकते हैं जो Type लेता है। Foo.Bar के तहत कोई भी "उप" नामस्थान Foo.Bar की लॉगर कॉन्फ़िगरेशन का उत्तराधिकारी होगा।
वैकल्पिक रूप से, आप GetLogger विधि का उपयोग कर किसी भी पुरानी स्ट्रिंग के आधार पर लॉगर ला सकते हैं जो string लेता है।

आप लॉगर्स को दो अलग-अलग तरीकों से ला सकते हैं। सबसे विशेष रूप से, Type या string द्वारा।

string द्वारा लाने में सक्षम होने के नाते, आप वास्तव में अपने लॉगर्स को कुछ भी नाम दे सकते हैं और उन्हें किसी भी चीज़ का उपयोग कर सकते हैं। वर्तमान में आपके पास क्या काम नहीं करेगा क्योंकि log4net क्लास के आधार पर लॉगर लाएगा ... ताकि आप दोनों विधियों के लिए एक ही लॉगर का उपयोग कर सकें।

क्या आप आप दो वालों बनाने के लिए क्या करना चाहते हैं के लिए:

<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

मैं भी साथ अनुभव नहीं कर रहा हूँ:

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method1"); 
    private static readonly ILog log2 = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method2"); 

    public void Method1() 
    { 
    log.info("message"); 
    } 

    public void Method2() 
    { 
    log2.info("message"); 
    } 
} 

यहाँ एक ही लकड़हारा xml फ़ाइल है। नेट, तो शायद कुछ निंजा प्रतिबिंब का उपयोग करके प्रत्येक विधि के लिए लॉगर्स प्राप्त करने के लिए कोई बेहतर/अधिक मजबूत तरीका मिल सकता है, लेकिन यह सबसे अच्छा है जो मैं कर सकता था।

6

वही लॉगर वर्तमान विधि के आधार पर, कम से कम सीधे नहीं, एकाधिक एपेंडर को रूट नहीं कर सकता है। हालांकि, आप क्या कर सकते कि आप क्या चाहते करने के लिए उपयोग log4net के फिल्टर

है। लॉग 4नेट फ्रेमवर्क प्रत्येक लॉगिंगएवेंट को location information के साथ पॉप्युलेट करता है जिसे आपको इच्छित फ़िल्टरिंग करने के लिए (उदा। विधि विधि) की आवश्यकता होती है। हालांकि, आपको उस पर फ़िल्टर करने के लिए शायद एक कस्टम IFilter लिखना होगा। IFilter लागू करने के लिए एक बहुत ही छोटा इंटरफ़ेस है: 1 विधि/1property। आपके फ़िल्टर की Decide() विधि प्रत्येक लॉगिंग ईवेंट पर पास किए गए 3 में से 3 निर्णय लेती है:

  • अस्वीकार करें। लॉगिंग घटना छोड़ देता है। ईवेंट लॉग नहीं है और एपेंडर के लिए फ़िल्टर श्रृंखला में कोई भी फ़िल्टर परामर्श नहीं दिया जाता है।
  • तटस्थ। लॉगिंग ईवेंट उस ऐपेंडर के लिए फ़िल्टर श्रृंखला में अगले फ़िल्टर को पास कर दिया जाता है।
  • स्वीकार करें। घटना लॉग है। फिल्टर श्रृंखला में कोई भी बाद के फ़िल्टर से परामर्श नहीं किया जाता है।

फिर प्रत्येक फ़िल्टरर के लिए फ़िल्टर श्रृंखला में अपना फ़िल्टर जोड़ें। यह फ्लाई पर किया जा सकता है, या इसे आपके log4net.config के माध्यम से कॉन्फ़िगर किया जा सकता है।

आपको पता होना चाहिए कि आपके द्वारा प्राप्त स्थान जानकारी की गुणवत्ता इस पर निर्भर है कि यह एक डीबग या रिलीज बिल्ड है या नहीं, और मुझे विश्वास है कि यह डिबगिंग प्रतीक उपलब्ध है।

तुम भी log4net के विभिन्न संदर्भों को देखने के लिए चाहते हो सकता है (और संदर्भ स्टैक्स)

यदि आप जिस पर आधारित करने के लिए कुछ प्रासंगिक जानकारी जोड़ने सब करने की ज़रूरत अपने छानने।

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