2009-09-07 16 views
41

के आधार पर अलग-अलग परिशिष्टों में त्रुटियों को भेजने के लिए log4net को कॉन्फ़िगर करें, मैं एक्सएमएल एपेंडर के लिए जानकारी स्तर & और EventLog एपेंडर में त्रुटि/घातक स्तर भेजना चाहता हूं।स्तर

मैं इकट्ठा कि मैं config की जड़ तत्व को संशोधित करने की जरूरत है, लेकिन मैं वाक्य रचना के साथ संघर्ष कर रहा हूँ। किसी दिए गए स्तर या स्तर की सीमा के लिए सही ऐपेंडर को सीधे लॉग करने के लिए कॉन्फ़िगरेशन सिंटैक्स क्या है?

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 

संपादित करें:: धन्यवाद @agileguy

यह विन्यास अब तक है। उस पोस्ट में वास्तव में मुझे आवश्यक वाक्यविन्यास शामिल था। काम कर समाधान अब इस तरह दिखता है:

<log4net> 
    <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="INFO"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ERROR"/> 
    </evaluator> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="SomeXmlAppender" /> 
    <appender-ref ref="SomeEventLogAppender" /> 
    </root> 
</log4net> 
+5

कृपया ध्यान दें कि मूल्यांकनकर्ता केवल appenders का समर्थन करने वाले बफरिंग द्वारा किया जाता है:

यहाँ config जो मेरे लिए काम किया है। यदि आप एक विशिष्ट स्तर प्रति एपेंडर निर्दिष्ट करना चाहते हैं तो आपको केवल तत्व का उपयोग करने की आवश्यकता है - इसे मूल्यांकनकर्ता में लपेटने की आवश्यकता नहीं है। – Brian

+0

तत्व केवल BufferingAppenderSkeleton (यानी RollingFileAppender नहीं) को लागू करने वाले परिशिष्टों के लिए उपयोग किया जाना चाहिए। – dave

+0

मुझे लगता है कि श्री ग्राहम का लेख [यहां] (http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx) आपको जा रहा है। –

उत्तर

6

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

<configuration> 
    <log4net> 
    <!--Database appender--> 
    <appender name="DbAppender" type="log4net.Appender.ADONetAppender"> 
     <bufferSize value="0" /> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <connectionString value="Data Source=AEG-PC\SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" /> 
     <commandText value="INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception]) VALUES 
     (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
     <parameter> 
     <parameterName value="@log_date" /> 
     <dbType value="DateTime" /> 
     <layout type="log4net.Layout.RawTimeStampLayout" /> 
     </parameter> 
     <parameter> 
     <parameterName value="@thread" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%t" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@log_level" /> 
     <dbType value="String" /> 
     <size value="10" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%p" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@logger" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%c" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@message" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%m" /> 
     </layout> 
     </parameter> 
     <parameter> 
     <parameterName value="@exception" /> 
     <dbType value="String" /> 
     <size value="4000" /> 
     <layout type="log4net.Layout.ExceptionLayout" /> 
     </parameter> 
     <threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE--> 
    </appender> 
    <!--File appender--> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="FileAppender" /> 
     <appender-ref ref="DbAppender" /> 
    </root> 
    </log4net> 
</configuration> 
13

यह appender भीतर threshold या filter तत्वों का उपयोग किया जा सकता है।

ध्यान दें कि सीमा appender, जहां यह एक समावेशी फिल्टर के रूप में कार्य करता है के तहत सीधे हो सकता है, या के तहत एक evaluator उदा

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

जहां यह लंघन बफरिंग (तत्काल उत्पादन) के लिए एक समावेशी फिल्टर, जहां लागू के रूप में कार्य करता है।



पूर्ण विवरण (source):

<threshold value="ERROR" /> 

थ्रेसहोल्ड AppenderSkeleton में लागू है और लगभग सभी appenders द्वारा इसलिए समर्थित है। यह सिर्फ एक साधारण परीक्षण है कि है लॉगिंग घटनाओं कि सीमा से नीचे एक स्तर है की अनदेखी करने के लिए प्रयोग किया जाता है। सीमा जल्दी चेक किया गया है और एक साधारण परीक्षण के रूप में बहुत performant है।

वहाँ एक और तरीका सीमा फ़िल्टर का उपयोग कर के रूप में ही व्यवहार निर्दिष्ट करने के लिए है। फ़िल्टर बहुत अधिक लचीले होते हैं और क्योंकि वे प्लग करने योग्य हैं, आप अपने स्वयं के कस्टम तर्क भी विकसित कर सकते हैं और फ़िल्टर श्रृंखला में डाल सकते हैं।

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR" /> 
    <levelMax value="OFF" /> 
</filter> 

थ्रेसहोल्ड जांच फिल्टर की तरह AppenderSkelton आधार वर्ग में लागू किया जाता है और लगभग सभी appenders द्वारा समर्थित हैं। उपर्युक्त फ़िल्टर का प्रभाव <threshold value="ERROR" /> जैसा ही है। यह एक LevelRangeFilter है जो ERROR से OFF (समावेशी) श्रेणी के स्तर के साथ किसी भी ईवेंट के माध्यम से अनुमति देगा। ध्यान दें कि OFF उच्चतम स्तर का नाम है, इसके विपरीत ALL निम्नतम स्तर का नाम है।

फिल्टर लचीलेपन का एक बड़ा सौदा है, क्योंकि एकाधिक फिल्टर एक साथ श्रृंखलित जा सकती है, घटनाओं कि उत्पादन कर रहे हैं से अधिक ठीक नियंत्रण प्रदान करती है। इस वजह से उनके पास प्रदर्शन के मामले में उच्च लागत भी है, श्रृंखला में प्रत्येक फ़िल्टर एक वस्तु है और से कार्यवाही के सही तरीके पर निर्णय लेने के लिए कहा जाता है। थ्रेसहोल्ड संपत्ति को फ़िल्टर करने के थ्रेसहोल्ड के साधारण मामले में फ़िल्टर में वरीयता में उपयोग किया जाना चाहिए।

EvaluatorBufferingAppenderSkeleton और द्वारा कार्यान्वित किया जाता इसलिए केवल appenders है कि इस आधार वर्ग का विस्तार करने और बफरिंग के लिए सहायता प्रदान द्वारा समर्थित है। SmtpAppender एक ऐसा एपेंडर है।

Evaluator एक प्लगेबल उद्देश्य यह है कि BufferingAppenderSkeleton द्वारा किया जाता है निर्धारित करने के लिए एक प्रवेश घटना बफ़र नहीं होना चाहिए है, लेकिन इसके बजाय लिखित/तुरंत भेजा। यदि मूल्यांकनकर्ता निर्णय लेता है कि ईवेंट महत्वपूर्ण है तो वर्तमान बफर की पूरी सामग्री ईवेंट के साथ भेजी जाएगी। मूल्यांकनकर्ता थ्रेसहोल्ड या फ़िल्टर की तरह कार्य नहीं करता है जिसमें यह ईवेंट को त्याग नहीं करता है।

1

मेरे पास एक ही प्रश्न था। ऐसा लगता है कि, मैं मूल प्रश्न को समझ रहा हूं, कि थ्रेसहोल्ड काम नहीं करेगा क्योंकि यह एक आउटपुट को कुछ आउटपुट भेज देगा और साथ ही शेष अन्य एपेंडर को भी भेज देगा। मैं ऊपर बताए गए LevelRangeFilter का उपयोग करके इसे काम करने में सक्षम था। मैं एक एपेंडर और अन्य सभी को एक अन्य एपेंडर के पास जाने के लिए त्रुटि, जानकारी और चेतावनी चाहता था, लेकिन त्रुटि, जानकारी और चेतावनी नहीं।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
     <appender name="LoggingAppender" type="log4net.Appender.FileAppender" > 
      <file value="logs.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="INFO"/> 
       <levelMax value="OFF"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <appender name="TracingAppender" type="log4net.Appender.FileAppender" > 
      <file value="traces.txt" /> 
      <filter type="log4net.Filter.LevelRangeFilter"> 
       <levelMin value="ALL"/> 
       <levelMax value="DEBUG"/> 
      </filter> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> 
      </layout> 
     </appender> 
     <root> 
      <appender-ref ref="LoggingAppender"/> 
      <appender-ref ref="TracingAppender"/> 
     </root> 
    </log4net> 
</configuration> 

धन्यवाद, निक