【问题标题】:Discarding several log levels within a range with log4net使用 log4net 丢弃一个范围内的多个日志级别
【发布时间】:2010-05-14 05:50:44
【问题描述】:

假设我将我的 log4net 记录器的 minLevelmaxLevel 分别设置为 FATALDEBUG,但在某些情况下,我想静音写入 WARN 级别的日志项,并保留所有范围内的其他级别处于活动状态。

是否可以以某种方式使用“离散”级别的日志级别,而不是使用 minLevelmaxLevel 指定范围?

我认为这应该很简单,但我没有找到任何处理此问题的 log4net 文档或示例。

【问题讨论】:

    标签: log4net


    【解决方案1】:

    您可以在附加程序上使用LevelMatchFilter

    例子:

    <appender name="FilteredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="DEBUG" />
        </filter>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="INFO" />
        </filter>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="ERROR" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
        ...
    </appender>
    

    这个例子只会打印 DEBUG;信息和错误消息。很容易根据您的需要进行自定义。

    注意:不要忘记末尾的DenyAllFilter

    【讨论】:

    • 嘿!感谢您的快速回复。可以以编程方式完成吗?我只找到了一种更改记录器(根)日志级别的方法,而不是每个附加程序的。
    • 对不起,我错过了你的评论。也应该可以通过编程方式进行。在这里您可以看到如何访问所有附加程序:stackoverflow.com/questions/3016108/…
    【解决方案2】:

    如何将 log4net 过滤器全部组合起来以实现所需的输出,这很酷。默认情况下,所有日志条目都有“中性”过滤器配置,log4net 默认记录所有中性条目。

    LevelRangeFilter 的作用是,如果条目的级别在范围内,它会将过滤器处置设置为“接受”(如果 acceptOnMatch 参数设置为 @,则保持其处置不变) 987654323@) 并且它将所有不在该范围内的条目标记为“拒绝”。

    LevelMatchFilter 会将levelToMatch 参数中指定的过滤器的处置设置为“接受”,除非acceptToMatch 设置为false,然后它将匹配条目设置为“拒绝”,不匹配的条目将保持原来的样子。

    所以你可以做的是结合使用这两个过滤器来得到你想要的:

    <appender name="FilteredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
        <filter type="log4net.Filter.LevelRangeFilter">
           <levelMax value="FATAL" />
           <levelMin value="ERROR" />
        </filter>
        <filter type="log4net.Filter.LevelMatchFilter">
            <levelToMatch value="WARN" />
            <acceptOnMatch value="false" />
        </filter>
    </appender>
    

    这将允许您轻松地打开和关闭警告级别。范围之外的所有条目都已标记为“拒绝”,此处的 LevelMatchFilter 也将 WARN 级别条目标记为拒绝,因此不需要 DenyAllFilter

    【讨论】:

      【解决方案3】:

      使用 LevelRangeFilter

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

      【讨论】:

      • 嘿,因为这是自然的使用形式,我尝试了这个选项,但它迫使我也记录级别 介于 FATAL 和 ERROR 的消息,这是我不想要的(即使 ERROR 和 FATAL 相邻,原理仍然适用)。还是谢谢!
      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多