2011-06-14 205 views
16

我有一個WinForm,它顯示日誌信息,但我希望它顯示爲只有INFO級別,但我希望日誌文件中的日誌也包含DEBUG級別。如何在log4net中記錄不同的日誌級別到不同的日誌appender

下面是我的配置:

<?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> 

現在它被設置爲INFO都LogFileAppender和RichTextBoxAppender。我嘗試在Gateway記錄器中取出LogFileAppender,然後移動到另一個記錄器,併爲此新記錄器設置爲「DEBUG」級別,但它仍在執行其中一個。如何配置它以便LogFileAppender具有DEBUG級別並且RichTextBoxAppender具有INFO級別?

回答

29

你應該可以爲你的兩個appender添加一個過濾器。

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

這樣一個附加器將只記錄到一定的水平,而對方即使它們由同一個記錄器定義不同的級別。

+0

感謝這解決了問題。我還需要更改級別值=「DEBUG」,然後按預期工作。 – Jen 2011-06-14 16:49:55

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消息,ERROR消息,而不是別的。

有很多方法來操縱過濾器,以得到你想要的。下面是文章(全免責聲明:我寫的),告訴您如何做一些不同的事情與過濾器除了剛纔級別範圍:

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

+0

有趣的把戲。恕我直言,它比公認的解決方案更靈活,因爲它允許拒絕一些在可接受的水平範圍內的水平 – 2017-12-14 11:31:57

相關問題