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


67

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

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

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

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

Answers:


80

当然,请使用过滤器。

这是发布在博客上的代码段,以供将来参考-所有内容归功于该博客文章的作者:

<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>

57

过滤器当然可以工作,但是我更喜欢直接关闭记录器(或记录器层次结构),如下所示:

<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是一个名称空间,则显示的配置将禁用整个名称空间的日志记录。第二个“示例”关闭类的日志记录(根据您的问题)。


1
它可与第三方集会一起使用吗?我正在尝试忽略RavenDb消息,到目前为止,还没有运气
chester89

1
我实际上设法做到了–通过指定正在记录的类的全名,以某种方式使用星号的命名空间没有实现
chester89,2014年

是的,Stefan,是在服务器端
chester89,2014年

通配符不起作用,但是您可以指定一个名称空间而不是一个类:此名称空间(和子名称空间)中的所有类都将受到影响
Stefan Egli 2014年

嗨,我认为这仅在您对每个类使用getLogger(myclass)时有效。如果您在applicationstart上生成了一个命名记录器,并在整个应用程序中通过引用使用了它,那么它将无法正常工作。还是我在这一点上不正确?
swe 2015年

15

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

在这种情况下,您要使用的过滤器是

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

提示:Log4Netconfig文件中,放置标签和标签的优先级实际上很重要。因此,在这种情况下,标签位于开始标签之后和标签之前。<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



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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.