log4net: Configure to ignore messages from a specific class
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?
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>
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).
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
.
You might want to try to apply a category to your own messages Try this thread: How to add category prefix to log4net message?
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>