2011-06-14 18 views
16

में विभिन्न लॉग एपेंडर को अलग-अलग लॉग स्तर को लॉग कैसे करें, मेरे पास एक WinForm है जो यह लॉग जानकारी प्रदर्शित करता है लेकिन मैं इसे केवल INFO स्तर पर प्रदर्शित करना चाहता हूं लेकिन मुझे लॉग फ़ाइल में लॉग को डीबीयूजी स्तर भी शामिल करना है।log4net

<?xml version="1.0" encoding="utf-8" ?> 
<!-- This section contains the log4net configuration settings --> 
<log4net> 
    <!-- Define some output appenders --> 

    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="${ALLUSERSPROFILE}\\Application Data\\logs\\Gateway" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <param name="StaticLogFileName" value="false" /> 
    <datePattern value=".yyyyMMdd.lo\g" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date | [%thread] | %-5level | %logger | %message %newline" /> 
    </layout> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
    <mapping> 
     <level value="DEBUG" /> 
     <backColor value="Blue" /> 
    </mapping> 
    <mapping> 
     <level value="INFO" /> 
     <backColor value="Green" /> 
    </mapping> 
    <mapping> 
     <level value="WARN" /> 
     <backColor value="Yellow" /> 
    </mapping> 
    <mapping> 
     <level value="ERROR" /> 
     <backColor value="Red" /> 
    </mapping> 
    <mapping> 
     <level value="FATAL" /> 
     <backColor value="Red, HighIntensity" /> 
    </mapping> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 

    <appender name="RichTextBoxAppender" type="Gateway.RichTextBoxAppender,Gateway" > 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="Header" value="[Header]\r\n"/> 
     <param name="Footer" value="[Footer]\r\n"/> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> 
    </layout> 
    <mapping> 
     <level value="DEBUG" /> 
     <textColorName value="DarkGreen" /> 
    </mapping> 
    <mapping> 
     <level value="INFO" /> 
     <textColorName value="ControlText" /> 
    </mapping> 
    <mapping> 
     <level value="WARN" /> 
     <textColorName value="Blue" /> 
    </mapping> 
    <mapping> 
     <level value="ERROR" /> 
     <textColorName value="Red" /> 
     <bold value="true" /> 
     <pointSize value="10" /> 
    </mapping> 
    <mapping> 
     <level value="FATAL" /> 
     <textColorName value="Black" /> 
     <backColorName value="Red" /> 
     <bold value="true" /> 
     <pointSize value="12" /> 
     <fontFamilyName value="Lucida Console" /> 
    </mapping> 
    </appender> 


    <!-- Setup the root category, add the appenders and set the default level --> 
    <root> 
    <level value="WARN" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="ColoredConsoleAppender" /> 
    <appender-ref ref="RichTextBoxAppender" /> 
    </root> 

    <logger name ="Gateway" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="ColoredConsoleAppender" /> 
    <appender-ref ref="RichTextBoxAppender" /> 
    </logger> 



</log4net> 
अभी यह दोनों LogFileAppender और RichTextBoxAppender के लिए जानकारी के लिए सेट है

:

नीचे मेरी विन्यास है। मैंने गेटवे लॉगर में LogFileAppender को निकालने का प्रयास किया और दूसरे लॉगर में स्थानांतरित किया और इस नए लॉगर के लिए "DEBUG" स्तर पर सेट किया लेकिन यह अभी भी एक या दूसरे को कर रहा है। मैं इसे कैसे कॉन्फ़िगर कर सकता हूं ताकि LogFileAppender में DEBUG स्तर हो और RichTextBoxAppender में INFO स्तर हो?

उत्तर

29

आप अपने दोनों परिशिष्टों को एक फ़िल्टर जोड़ने में सक्षम होना चाहिए।

<filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     <levelMax value="FATAL" /> 
</filter> 

इस तरह एक appender केवल अन्य जबकि एक अलग स्तर भले ही वे एक ही लकड़हारा द्वारा परिभाषित कर रहे करने के लिए एक निश्चित स्तर तक प्रवेश करेंगे।

+0

धन्यवाद इस समस्या का हल: यहाँ एक लेख (मैं इसे लिखा था पूर्ण त्याग) है। मुझे स्तर मान = "DEBUG" को बदलने की भी आवश्यकता है, फिर यह अपेक्षा के अनुसार काम करता है। – Jen

25

मैं @gwhitake से सहमत हूं कि आप स्तर श्रेणी फ़िल्टर का उपयोग कर सकते हैं। हालांकि, मैं यह भी जोड़ना चाहता हूं कि आप LevelMatch फ़िल्टर का उपयोग कर सकते हैं यदि आप केवल एक स्तर का चयन करना चाहते हैं। यह फ़िल्टर आपको इसके अंत में एक और फ़िल्टर जोड़ने की अनुमति देता है ताकि आप एक फ़िल्टर बना सकें जिसमें दो या दो से अधिक स्तर हों, भले ही वे क्रम में एक-दूसरे के आगे न हों।

उदाहरण के लिए, निम्न फ़िल्टर केवल डीबग और त्रुटि संदेश (सिर्फ एक उदाहरण के रूप में) पर कब्जा होगा:

<filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="DEBUG"/> 
</filter> 
<filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR"/> 
</filter> 
<filter type="log4net.Filter.DenyAllFilter" /> 

यहाँ एक महत्वपूर्ण यह है कि हम अंत में DenyAllFilter की आवश्यकता है। यह लॉगजर को बताता है कि यदि यह इस पंक्ति तक पहुंचता है, तो इसे लॉग न करें। इस तरह यह DEBUG संदेशों, त्रुटि संदेशों, और कुछ और लॉग इन करेगा।

फ़िल्टर को कुशलतापूर्वक प्राप्त करने के कई तरीके हैं जो आप चाहते हैं। आप कैसे बस स्तर रेंज के अलावा फिल्टर के साथ अलग अलग बातें की एक संख्या करने के लिए पता चलता है कि:

http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx

+0

दिलचस्प चाल। आईएमएचओ, यह स्वीकार किए गए समाधान से अधिक लचीला है, क्योंकि यह स्वीकार किए गए स्तरों की सीमा में कुछ स्तरों को अस्वीकार करने की अनुमति देता है –