Programmatically check Log4Net log

Today I needed to create unit test that checked if the NHibernate query was generated optimally.

Good thing is that, in case of an inefficient query, NHibernate puts a warning using log4net:

log.Warn( "firstResult/maxResults specified with collection fetch; applying in memory!" );

I wanted something like this:

public void FindUsersBy_QueryWithLimit_LimitsOnSQLSide()
    using (LogChecker logChecker
        = new LogChecker("NHibernate", Level.Warn))
        // Execute query using NHibernate

        // ....


The problem is that it’s not that easy to attach MemoryAppender for a duration of unit test to the specified logger.

Anyway here’s the code:

public class LogChecker : IDisposable
    readonly Logger _logger;
    readonly Level _previousLevel;
    readonly MemoryAppender _appender = new MemoryAppender();

    public LogChecker(string logName, Level levelToCheck)
        _logger = (Logger)LogManager.GetLogger(logName).Logger;
        _previousLevel = _logger.Level;
        _logger.Level = levelToCheck;

    public List<string> Messages
            return new List<loggingEvent>(_appender.GetEvents())
                  .ConvertAll(x => x.RenderedMessage);

    public void Dispose()
        _logger.Level = _previousLevel;

Tags: , ,

4 Responses to “Programmatically check Log4Net log”

  1. pete Says:

    Thanks, that’s usefull 🙂

  2. NHibernate ignores SetMaxResults in SQL | Blog | Limilabs Says:

    […] Here you can see the implementation of the LogChecker log4net log reader […]

  3. stormi campbell Says:

    help on gmail

  4. Limilabs support Says:


    How can we help? Do you use Mail.dll?


Consider using our Q&A forum for asking any questions.