【问题标题】:Is it possible to wildcard logger names in log4net configuration?是否可以在 log4net 配置中使用通配符记录器名称?
【发布时间】:2011-01-02 16:52:04
【问题描述】:

在我的应用程序中,我使用 log4net,所有类型都根据它们的类型创建自己的记录器 - 例如:

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

在开发过程中,我将根记录器保留在 DEBUG 上,以便从我的代码中捕获所有日志输出。

但是,第三方组件也使用相同的方法,但每秒生成 100 条日志消息,我对这些消息都不感兴趣。

是否可以在记录器配置中使用某种通配符,以强制所有记录器仅在 WARN 处记录,例如:

 <logger name="com.thirdparty.*">
    <level value="WARN"/>
  </logger>

[上面的确切示例,使用 * 不起作用]

【问题讨论】:

    标签: c# .net log4net


    【解决方案1】:

    您可以只指定命名空间的一部分,以便将其应用于该命名空间内的所有消息(包括嵌套消息)。

    这是我经常使用的例子:

      <root>
        <level value="FATAL" />
        <appender-ref ref="RollingFile" />
      </root>
    
      <logger name="MyCompany.Web" >
        <level value="WARN" />
        <appender-ref ref="WebErrors" />
      </logger>
    
      <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested -->
      <logger name="NHibernate" >
        <level value="FATAL" />
      </logger>
    

    另外,我建议阅读手册。它提供了很多解释。例如,您可以阅读有关Logger Hierarchy 的信息。这是那里的报价:

    据说记录器是 另一个记录器,如果其名称后跟 点是后代的前缀 记录器名称。记录器被称为 子记录器的父级(如果有) 自己和自己之间没有祖先 后代记录器。层次结构有效 非常类似于 .NET 中的命名空间和类层次结构。

    还有:

    关卡继承: 给定记录器 X 的继承级别等于第一个 记录器中的非空级别 层次结构,从 X 和 在层次结构中向上进行 朝向根记录器。

    【讨论】:

    • @Dmitriy - 你是对的。我从来不知道!我现在几乎觉得问起来有点傻:)。感谢您的回答。
    • 顺便说一句,所有这些都在 log4net 网站上有很好的记录。我添加了答案的链接。
    • 感谢 Dmitriy 的链接。我不禁想知道如果每个人都只是阅读手册,Stack Overflow 会在哪里。
    【解决方案2】:

    你不能做与你所要求的相反的事情吗?我的意思是将默认日志级别设置为warn,然后将您定义的特定记录器设置为DEBUG。

    另外,您可以将 appender 的阈值设置为 DEBUG,并让其他 appender 设置 WARN。

    例如:

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
        <applicationName value="Application" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
        <threshold value="WARN" />
    </appender>
    
    <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
        <to value="asdf@example.com" />
        <from value="group@example.com" />
        <subject value="Notification" />
        <smtpHost value="server01" />
        <bufferSize value="1" />
        <lossy value="false" />
        <layout type="log4net.Layout.PatternLayout,log4net">
            <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
        </layout>
        <threshold value="DEBUG" />
    </appender>
    

    【讨论】:

    • @Brian - 感谢您的回复。是的 - 我可以,但问题是我有很多类型。采用白名单方法进行日志记录会使我的日志记录配置变得庞大且笨拙,这就是为什么我想知道黑名单方法的原因。
    • 明白。我只是根据您定义的其他记录器数量提供了一种可能的方法。我更新了我的答案,建议在附加程序级别定义一个阈值。然后只需更改 3rd 方库以使用具有适当阈值的 appender,同时您的 appender 仍设置为 DEBUG。
    • @Brian - 无论如何感谢您的建议 - 如果您只有几个记录器,这是一个好方法。至于您建议的第二部分-在我的情况下,我希望两者都转到同一个目标(单个日志文件或控制台窗口)。这种方法在那里仍然有效吗?
    • 不,如果您更改附加程序上的阈值,它将适用于每个记录到它的记录器。这意味着如果您要将所有记录器指向同一个附加程序,那么它们都将具有相同的阈值。它不适合你的情况。
    猜你喜欢
    • 2017-11-17
    • 2010-12-29
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多