2011-06-14 4 views
16

로그 정보를 표시하는 WinForm이 있지만이를 INFO 레벨로만 표시하려고하지만 로그 파일에 DEBUG 레벨도 포함되도록하고 싶습니다. 지금이 LogFileAppender 및 RichTextBoxAppender 모두 INFO로 설정되어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> 

:

다음은 내 구성입니다. 게이트웨이 로거에서 LogFileAppender를 꺼내 다른 로거로 옮기고이 새로운 로거에 대해 "DEBUG"레벨로 설정하려고했지만 여전히 하나 또는 다른 것을 수행하고 있습니다. LogFileAppender에 DEBUG 레벨이 있고 RichTextBoxAppender에 INFO 레벨이 있도록 구성하려면 어떻게합니까?

답변

29

두 애 퍼처 모두에 필터를 추가 할 수 있어야합니다.

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

동일한 로거에서 정의 된 경우에도 하나의 appender는 특정 수준에만 기록하고 다른 하나는 다른 수준으로 기록됩니다.

+0

덕분에이 문제를 해결 : 다음 기사 (내가 쓴 완전 면책 조항)입니다. 나는 또한 수준 값 = "DEBUG"을 변경해야합니다. 그러면 예상대로 작동합니다. – Jen

25

레벨 범위 필터를 사용할 수 있다는 것에 동의합니다. 그러나 하나의 레벨 만 선택하려는 경우 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

흥미로운 트릭. IMHO, 허용 된 솔루션의 범위 내에서 일부 수준을 거부 할 수 있으므로 허용 된 솔루션보다 유연성이 뛰어납니다. –

관련 문제