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

Posted

技术标签:

【中文标题】log4net:配置为忽略来自特定类的消息【英文标题】:log4net: Configure to ignore messages from a specific class 【发布时间】:2011-07-27 02:59:23 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

当然,使用filter.

这是发布在博客上的 sn-p,以供将来参考 - 全部归功于该博客文章的作者:

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

【讨论】:

【参考方案2】:

过滤器确实有效,但我更愿意像这样直接关闭记录器(或记录器层次结构):

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

【讨论】:

它是否适用于第 3 方程序集?我试图忽略 RavenDb 消息,到目前为止没有运气 我实际上设法做到了 - 通过指定正在记录的类的全名,不知何故带有星号的命名空间没有做到这一点 Stefan,是的,在服务器端 通配符不起作用,但是你可以指定一个命名空间而不是一个类:那么这个命名空间(和子命名空间)中的所有类都会受到影响 嗨,我认为这只有在您对每个类都使用 getLogger(myclass) 时才有效。如果您在 applicationstart 上生成一个命名记录器并在您的完整应用程序中通过引用使用它,它将不起作用。还是我在这一点上不正确?【参考方案3】:

我建议也使用Filters。但是,由于我在尝试实现过滤器时很难找到整个画面,所以我发布了我创建的Configutation file 的示例 sn-p,它指出了过滤器的去向。

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

log4net.Filter.LoggerMatchFilter ----(匹配一个开始的 记录器名称。)

提示:Log4Netconfig 文件中,放置标签的位置很重要,它们的优先级实际上很重要。因此,在这种情况下,&lt;filter&gt; 标记位于 &lt;appender&gt;opening 标记之后和 &lt;file value = ... /&gt; 标记之前。

<?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 的日志。

【讨论】:

【参考方案4】:

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

【讨论】:

感谢您的提示。我的过滤器无法正常工作,直到我将它移到“文件值 =...”之前【参考方案5】:

如果您使用 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>

【讨论】:

以上是关于log4net:配置为忽略来自特定类的消息的主要内容,如果未能解决你的问题,请参考以下文章

为 log4net 设置动态连接字符串

如何配置log4net以便log.IsDebugEnabled为true

Log4Net“找不到架构信息”消息

通过 log4net 可配置的敏感数据屏蔽

我们可以在 log4net %property 中设置字符限制为 10 个字符吗?

可以将 log4net 配置为以自己的身份运行吗?