【问题标题】:How to log different log level to different log appender in log4net如何在 log4net 中将不同的日志级别记录到不同的日志附加器
【发布时间】:2011-06-14 16:02:44
【问题描述】:

我有一个显示日志信息的 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。我尝试在网关记录器中取出 LogFileAppender 并移动到另一个记录器并为此新记录器设置为“DEBUG”级别,但它仍在做一个或另一个。如何配置,使 LogFileAppender 具有 DEBUG 级别,RichTextBoxAppender 具有 INFO 级别?

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    您应该能够为您的两个附加程序添加过滤器。

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

    这样一个附加器只会记录到某个级别,而另一个附加器将记录到不同的级别,即使它们是由同一个记录器定义的。

    【讨论】:

    • 感谢这解决了问题。我还需要更改级别 value="DEBUG" 然后它按预期工作。
    【解决方案2】:

    我同意@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

    【讨论】:

    • 有趣的把戏。恕我直言,它比公认的解决方案更灵活,因为它允许拒绝接受级别范围内的某些级别
    猜你喜欢
    • 2014-02-06
    • 2020-12-25
    • 2014-12-27
    • 2022-10-14
    • 2012-02-08
    • 2018-03-11
    • 2012-06-24
    • 2013-03-26
    相关资源
    最近更新 更多