log4net: Configure to ignore messages from a specific class

C#LoggingLog4net

C# Problem Overview


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?

C# Solutions


Solution 1 - C#

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>

Solution 2 - C#

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

Solution 3 - C#

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.

Solution 4 - C#

You might want to try to apply a category to your own messages Try this thread: https://stackoverflow.com/questions/4454755/how-to-add-category-prefix-to-log4net-message

Solution 5 - C#

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>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKyleView Question on Stackoverflow
Solution 1 - C#Jerod VenemaView Answer on Stackoverflow
Solution 2 - C#Stefan EgliView Answer on Stackoverflow
Solution 3 - C#MehradView Answer on Stackoverflow
Solution 4 - C#OrinView Answer on Stackoverflow
Solution 5 - C#JulsView Answer on Stackoverflow