如何在log4net中将不同的日志级别记录到不同的日志附加器中

21

我有一个WinForm,它显示日志信息,但我只想显示INFO级别的日志,而我希望日志文件中包含DEBUG级别的日志。

以下是我的配置:

<?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都被设置为INFO。我尝试将Gateway logger中的LogFileAppender删除并移动到另一个logger,并为这个新logger设置为“DEBUG”级别,但它仍然只做其中之一。我该如何配置才能使LogFileAppender具有DEBUG级别,而RichTextBoxAppender具有INFO级别?

2个回答

34

你应该可以给两个appender都添加一个过滤器。

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

即使两个appender由同一个logger定义,这种方式可以让一个appender只记录特定级别的日志,而另一个则记录不同级别的日志。


谢谢,这解决了问题。我还需要更改级别值为“DEBUG”,然后它就可以按预期工作了。 - Jen

29

我同意@gwhitake的观点,你可以使用级别范围过滤器。但是我想补充一点,如果你只想选择一个级别,你可以使用LevelMatch过滤器。该过滤器还允许在其末尾添加另一个过滤器,因此即使这些级别在顺序上不相邻,你也可以创建一个有两个或更多级别的过滤器。

例如,以下过滤器将仅捕获DEBUG和ERROR消息(只是一个示例):

<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


有趣的技巧。在我看来,它比被接受的解决方案更灵活,因为它允许拒绝接受级别范围内的某些级别。 - Nicolas Vannier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接