log4net: Configure to ignore messages from a specific class

前端 未结 5 792
孤独总比滥情好
孤独总比滥情好 2020-12-02 15:24

Is there a way to have the log4net configuration ignore a specific class? For example, we generally create a log in every class. Similar to this:

private sta         


        
相关标签:
5条回答
  • 2020-12-02 15:37

    Sure, use a filter.

    Here's the snippet posted on the blog, for future reference - all credit to the author of that blog post:

    <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>
    
    0 讨论(0)
  • 2020-12-02 15:40

    Just wanted to post the common exclusions if you are using NHibernate and log4net. Note that each filter needs its own element.

    <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>
    
    0 讨论(0)
  • 2020-12-02 15:48

    I would suggest using Filters as well. However, since I struggled finding the whole picture when I was trying to implement the filter I am posting a sample snippet of the Configutation file I created which points out where filters go.

    The filter you are going for in this case would be

    log4net.Filter.LoggerMatchFilter ----(Matches against a the start of the logger name.)

    Hint: In the config file for Log4Net it is important where you put your tags and the priority of them actually matters. So in this case <filter> tag comes after the <appender>opening tag and before it's <file value = ... /> tag.

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

    In this technique you can have multiple appenders which you can redirect the logging results of a specific logger to a separate appender instead of ignoring them. Such as one appender for all logs and one for the filtered out logs for a specific class.

    0 讨论(0)
  • 2020-12-02 15:48

    You might want to try to apply a category to your own messages Try this thread: How to add category prefix to log4net message?

    0 讨论(0)
  • 2020-12-02 15:50

    A filter certainly works but I would prefer to turn off the logger (or logger hierarchy) directly like this:

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

    Assuming that YourNameSpace.WithNoLogging is a namespace then the shown configuration would disable logging on the entire name space. The second "example" turns off logging for your class (according to your question).

    0 讨论(0)
提交回复
热议问题