I have two appenders, one (InfoAppender) with a levelMin info filter and one (DebugAppender) without filter. This works great. I can also set minimum logging levels for individual loggers using the element. But now I want to have most loggers logging info (and above) to InfoAppender and debug (and above) to DebugAppender, but a certain chatty logger (NHibernate) logging warn (and above) to InfoAppender and info (and above) to DebugAppender.
I looked at the solution provided in Log4Net Logging of two different levels to two different appenders for the same logger, but it doesn't work for me. I have the following configuration:
<log4net>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Info.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
</appender>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Debug.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<logger name="NHibernate" additivity="false">
<appender-ref ref="InfoAppender">
<threshold value="WARN" />
</appender-ref>
<appender-ref ref="DebugAppender">
<threshold value="INFO" />
</appender-ref>
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="DebugAppender" />
</root>
</log4net>
I have the following test code:
XmlConfigurator.Configure();
var logger1 = LogManager.GetLogger("Program");
var logger2 = LogManager.GetLogger("NHibernate");
logger1.Debug("Debug message");
logger2.Debug("Debug message");
logger1.Info("Info message");
logger2.Info("Info message");
logger1.Warn("Warn message");
logger2.Warn("Warn message");
But both debug messages are logged to DebugAppender and both info messages are logged to InfoAppender.