Log4net (लकड़हारा नामकरण) का उपयोग करने का सही तरीका


83

लॉग 4नेट को कॉन्फ़िगर करने और उपयोग करने के दो तरीके हैं। पहली बात यह है कि जब मैं अपने स्वयं के एपेंडर और संबंधित लकड़हारे को कॉन्फ़िगर कर सकता हूं

<!-- language: xml -->

<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs\myLog.log" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level - %message%n" />
    </layout>
</appender>

<logger name="myLog">
    <level value="All"></level>
    <appender-ref ref="myLogAppender" />
</logger>

और फिर जब मैं लॉग इन में कुछ लिखना चाहता हूं, तो मैं निम्नलिखित कर सकता हूं:

ILog log = LogManager.GetLogger("myLog");
log.Info("message");

इसका उपयोग करने का दूसरा तरीका रूट को कॉन्फ़िगर करना है जैसा कि मैं चाहता हूं:

<!-- language: xml -->

<root>
    <level value="Error" />
    <appender-ref ref="myLogAppender" />
</root>

और इस मामले में मैं इस तरह से संदेश भेज सकता हूं:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

दूसरे दृष्टिकोण का लाभ यह है कि आप फ्लाई पर कुछ संदेशों को सक्षम या अक्षम कर सकते हैं। लेकिन समस्या यह है कि मैं EPiServer CMS में विकसित हो रहा हूं और इसकी अपनी लॉगिंग प्रणाली है जो log4net का उपयोग करता है और अगर मैं रूट स्तर पर जानकारी लॉगिंग को सक्षम करता हूं, तो बहुत सारे सिस्टम लॉग लिखे जाएंगे।

आप log4net का उपयोग कैसे करते हैं? सिस्टम का प्रत्येक भाग अपने स्वयं के लकड़हारे में लिखता है, या सब कुछ डिफ़ॉल्ट लकड़हारे में लिखा जाता है, और कॉन्फ़िगरेशन तय करता है कि आगे क्या करना है?

जवाबों:


96

कोड के भीतर आप संदेशों को कैसे लॉग करते हैं, इसके बारे में, मैं दूसरे दृष्टिकोण का विकल्प चुनूंगा:

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

जहां उपर्युक्त लॉग में भेजे गए संदेश पूरी तरह से योग्य प्रकार का उपयोग करके 'नाम' होगा Bar, जैसे

MyNamespace.Foo.Bar [INFO] message

इस दृष्टिकोण का लाभ यह है कि यह लॉगिंग के आयोजन के लिए वास्तविक मानक है, यह आपको नामस्थान द्वारा अपने लॉग संदेशों को फ़िल्टर करने की भी अनुमति देता है। उदाहरण के लिए, आप निर्दिष्ट कर सकते हैं कि आप INFO स्तर के संदेश को लॉग इन करना चाहते हैं, लेकिन Barविशेष रूप से DEBUG के लिए लॉगिंग स्तर बढ़ाएँ:

<log4net>
    <!-- appenders go here -->
    <root>
        <level value="INFO" />
        <appender-ref ref="myLogAppender" />
    </root>

    <logger name="MyNamespace.Foo.Bar">
        <level value="DEBUG" />
    </logger>
</log4net>

नाम के माध्यम से अपने लॉगिंग को फ़िल्टर करने की क्षमता log4net की एक शक्तिशाली विशेषता है, यदि आप बस अपने सभी संदेशों को लॉग इन करते हैं, तो आप "myLog"इस शक्ति को बहुत ढीला कर देते हैं!

EPiServer CMS के बारे में, आपको CMS और अपने कोड के लिए एक अलग लॉगिंग स्तर निर्दिष्ट करने के लिए उपरोक्त दृष्टिकोण का उपयोग करने में सक्षम होना चाहिए।

आगे पढ़ने के लिए, यहाँ एक कोडप्रोजेक्ट लेख है जो मैंने लॉगिंग पर लिखा है:


5
आप यहां तक कि पैटर्न नेमआउट लॉगिंग .apache.org/ log4net/ release/ sdk/… "" का उपयोग करके लॉग में शोर को कम करने के लिए वर्ग नामस्थान के लॉग भाग से बाहर कर सकते हैं। उदाहरण के लिए, लकड़हारा नाम "abc" पैटर्न% लकड़हारा {2} के लिए होगा आउटपुट "बीसी"। "
एल्फेग

7
निजी स्थैतिक रूप से आसानी से ILog log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod ()। DeclaringType);
कैस्पर लियोन नीलसन

क्यों दूसरा दृष्टिकोण पहले की तुलना में बेहतर है ?! वर्ग का नाम स्थिर है, और यदि आप इसे बदलते हैं, तो आपको लकड़हारे में भी नाम अपडेट करना होगा, क्या केवल कक्षा का नाम प्राप्त करने के लिए प्रतिबिंब कॉल करने का कोई मतलब है?
MeTitus

1
@CasperLeonNielsen क्या आप बता सकते हैं कि यह किस तरह से अलग है this.GetType()?
एरिक

2
@EricE this.GetType () स्थिर संपत्ति को परिभाषित करते समय, या किसी स्थिर वर्ग में, या किसी निर्माता के बाहर उपलब्ध नहीं होगा।
ढोची

12

मेरा उत्तर देर से आ रहा है, लेकिन मुझे लगता है कि यह नौसिखिया की मदद कर सकता है। जब तक नीचे के रूप में परिवर्तन नहीं किए जाते हैं, तब तक आपको क्रियान्वित लॉग दिखाई नहीं देंगे।

जब आप Log4net को लागू करते हैं तो 2 फाइलों में बदलाव करना पड़ता है।


  1. प्रोजेक्ट में log4net.dll का संदर्भ जोड़ें ।
  2. app.config
  3. कक्षा फ़ाइल जहाँ आप लॉग को लागू करेंगे।

अंदर [ app.config ]:

सबसे पहले, 'कॉन्फ़िगरेशन' के तहत, आपको नीचे दिए गए कोड को जोड़ना होगा;

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

फिर, 'कॉन्फ़िगरेशन' ब्लॉक के तहत, आपको नीचे दिए गए कोड के टुकड़े को लिखने की आवश्यकता है। (कोड का टुकड़ा मेरी आवश्यकता के अनुसार अनुकूलित किया गया है, लेकिन यह आकर्षण की तरह काम करता है।)

<log4net debug="true">
    <logger name="log">
      <level value="All"></level>
      <appender-ref ref="RollingLogFileAppender" />
    </logger>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
      </layout>
    </appender>
</log4net>

कॉलिंग क्लास के अंदर :

उस वर्ग के अंदर जहां आप इस log4net का उपयोग करने जा रहे हैं, आपको कोड ऑफ पीस घोषित करने की आवश्यकता है।

 ILog log = LogManager.GetLogger("log");

अब, आप तैयार हैं कॉल लॉग उसी जगह जहाँ आप चाहते हैं। नीचे एक विधि है जिसे आप ऑपरेशन करते समय कॉल कर सकते हैं।

log.Error("message");

आपको ILogएक उदाहरण-सदस्य बनाने की आवश्यकता नहीं है ? मैंने यहाँ और अधिक विस्तार से एक ही प्रश्न पूछा है लेकिन शायद मैं आपका इनपुट प्राप्त कर सकता हूँ?
मिन्ह ट्रान

6

अपने इनवोकिंग क्लास का नाम रखने के बजाय, मैंने निम्नलिखित का उपयोग करना शुरू कर दिया:

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

इस तरह, मैं हर क्लास में कोड की एक ही लाइन का उपयोग कर सकता हूं, जब मैं कॉपी और पेस्ट करने पर कोड बदलने के लिए याद किए बिना log4net का उपयोग करता हूं। वैकल्पिक रूप से, मैं एक लॉगिंग क्लास बना सकता हूं, और मेरे लॉगिंग क्लास से प्रत्येक दूसरे वर्ग को विरासत में मिला है।


0

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

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