log4net: Configure to ignore messages from a speci

2019-01-10 14:09发布

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 static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");

The problem is MyClass logs an extreme amount of data and it gets hard to find information about other classes. Its another dev that uses MyClass so I cannot just go in and change around the log files, but in my environment I would like to ignore these.

Can I set my configuration file to ignore the messages from a specific class?

4条回答
beautiful°
2楼-- · 2019-01-10 14:19

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're goning 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's 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.

查看更多
放荡不羁爱自由
3楼-- · 2019-01-10 14:26

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

查看更多
我只想做你的唯一
4楼-- · 2019-01-10 14:32

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

查看更多
别忘想泡老子
5楼-- · 2019-01-10 14:40

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>
查看更多
登录 后发表回答