【问题标题】:How to set logger specific levels per appender in Log4Net如何在 Log4Net 中为每个附加程序设置记录器特定级别
【发布时间】:2010-07-26 18:32:25
【问题描述】:

给定两个附加器:A1、A2 和多个记录器,其中一个是 L1

是否可以这样配置 log4net:

A1 从所有记录器中获取 DEBUG 及以上版本L1 除外,它为其获取 INFO 及以上版本
A2 从所有 logger 获取 DEBUG 及以上

我已经查看了 appender 阈值、过滤器和我能想到的所有其他配置组合,但它们似乎都没有完成上述操作。

【问题讨论】:

    标签: c# log4net


    【解决方案1】:

    您可以执行以下操作:

    1. 在没有任何过滤器的情况下定义两个附加程序(A1、A2)
    2. 创建一个 BufferingForwardingAppender,转发到 A1 并过滤级别 >= INFO
    3. 创建一个 BufferingForwardingAppender,转发到 A2(无过滤器或 >= DEBUG)
    4. 将根记录器配置为使用附加程序 A1、A2
    5. 将 L1 记录器配置为不继承附加程序(可加性 = false);改为引用两个 BufferingForwardingAppender

    我没有测试它,但我不明白为什么这不起作用。

    【讨论】:

    • 感谢 Stefan,这个解决方案确实达到了预期的效果。我只需要一个额外的 BufferingForwardingAppender,因为 logger L1 可以直接引用 A2。
    【解决方案2】:

    根据文档:

    过滤器形成一个事件必须通过的链。一路上的任何过滤器都可以接受事件并停止处理,拒绝事件并停止处理,或允许事件进入下一个过滤器。如果事件在没有被拒绝的情况下到达过滤器链的末尾,则它被隐式接受并被记录。

    所以看起来像这样的东西会起作用(未经测试的伪代码):

    A1
        Level >= INFO:  Accept
        Logger == L1: Deny
        Level >= DEBUG: Accept
        DenyAll
    
    A2
        Level >= DEBUG: Accept
    

    【讨论】:

    • 我试过了,但 A1 末尾的 DenyAll 过滤器阻止了任何内容的记录。我删除了 DenyAll 行,A1 得到了所有其他记录器的调试,但 L1 什么也没有。我认为对记录器 L1 的拒绝属于文档的“拒绝事件并停止处理”声明。话虽如此,即使它没有解决这个问题,我也很感谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2012-11-17
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多