是否可以在log4net配置中使用通配符记录器名称?

时间:2010-01-07 22:11:34

标签: c# .net log4net

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:34)

您只需指定命名空间的一部分,即可应用于该命名空间中的所有消息(包括嵌套)。

这是我经常使用的例子:

  <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和开始   在层次结构中向上进行   朝向根记录器。

答案 1 :(得分:4)

你不能做与你所要求的相反的事情。我的意思是将默认日志级别设置为 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>