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

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

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

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

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

【问题讨论】:

    标签: c# logging log4net


    【解决方案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>
        

        【讨论】:

          猜你喜欢
          • 2012-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-30
          相关资源
          最近更新 更多