log4net:配置忽略来自特定类的消息

时间:2011-03-31 17:53:32

标签: c# logging log4net

有没有办法让log4net配置忽略特定的类?例如,我们通常在每个类中创建一个日志。与此类似:

private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");

问题是MyClass记录了大量数据,很难找到有关其他类的信息。它是另一个使用MyClass的开发人员所以我不能只是进入并更改日志文件,但在我的环境中我想忽略这些。

我可以将configuration文件设置为忽略来自特定类的消息吗?

5 个答案:

答案 0 :(得分:71)

当然,请使用filter.

以下是博客上发布的片段,供将来参考 - 所有归功于该博客文章的作者:

<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- ...but not the rest of it -->
  <loggerToMatch value="Noisy.Namespace" />
  <acceptOnMatch value="false" />
</filter>

答案 1 :(得分:54)

过滤器肯定有效,但我更喜欢直接关闭记录器(或记录器层次结构),如下所示:

<logger name="YourNameSpace.WithNoLogging" additivity="false">
    <level value="OFF" />        
</logger>
<logger name="MyClass" additivity="false">
    <level value="OFF" />        
</logger>
<root>
    <level value="ALL" />
    <appender-ref ref="YourAppender" />
</root>

假设YourNameSpace.WithNoLogging是名称空间,则显示的配置将禁用整个名称空间的日志记录。第二个“示例”会关闭您班级的日志记录(根据您的问题)。

答案 2 :(得分:14)

我建议也使用Filters。但是,由于我在尝试实现过滤器时难以找到整个图片,因此我发布了一个我创建的Configutation file的示例片段,指出过滤器的位置。

在这种情况下,您正在进行过滤的过滤器将是

  

log4net.Filter.LoggerMatchFilter ----(与...的开头相匹配   记录器名称。)

对于 Log4Net config文件中的

提示,重要的是放置标签并确保其优先级非常重要。因此,在这种情况下,<filter>标记位于<appender>开头标记之后且位于<file value = ... />标记之前。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LoggerMatchFilter">
                <loggerToMatch value="Foo.namespace.bar.mySubclass" />
                <acceptOnMatch value="false" />
            </filter>
            <file value="myPassedDevices.log" />
            <appendToFile value="true" />
            <maximumFileSize value="100KB" />
            <maxSizeRollBackups value="2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%timestamp    %level  - %message  [%thread]       %logger%newline" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
            <appender-ref ref="RollingFile.PassedDevices" />
        </root>
    </log4net>
</configuration>

在此技术中,您可以拥有多个appenders,您可以将特定记录器的记录结果重定向到单独的appender,而不是忽略它们。例如,所有日志都有一个appender,而特定class的已过滤日志有一个。{/ p>

答案 3 :(得分:2)

您可能想尝试将类别应用于自己的消息 试试这个帖子: How to add category prefix to log4net message?

答案 4 :(得分:0)

如果您正在使用NHibernate和log4net,则只想发布常见排除项。请注意,每个过滤器都需要有自己的元素。

<filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="NHibernate.Engine.StatefulPersistenceContext.ProxyWarnLog" />
    <acceptOnMatch value="false" />
  </filter>
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="NHibernate.LazyInitializationException" />
    <acceptOnMatch value="false" />
  </filter>
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="NHibernate.Cache.NoCacheProvider" />
    <acceptOnMatch value="false" />
  </filter>