<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lesnikowski Blog &#187; log4net</title>
	<atom:link href="http://www.lesnikowski.com/blog/index.php/tag/log4net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lesnikowski.com/blog</link>
	<description>.Net</description>
	<lastBuildDate>Wed, 28 Jul 2010 10:10:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Programmatically check Log4Net log</title>
		<link>http://www.lesnikowski.com/blog/index.php/programmatically-check-log4net/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=programmatically-check-log4net</link>
		<comments>http://www.lesnikowski.com/blog/index.php/programmatically-check-log4net/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 10:16:49 +0000</pubDate>
		<dc:creator>Pawel Lesnikowski</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[log4net]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[UnitTesting]]></category>

		<guid isPermaLink="false">http://www.lesnikowski.com/blog/?p=308</guid>
		<description><![CDATA[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( &#34;firstResult/maxResults specified with collection fetch; applying in memory!&#34; );

I wanted something like this:

[Test]
public void FindUsersBy_QueryWithLimit_LimitsOnSQLSide()
{
    using (LogChecker logChecker
    [...]]]></description>
			<content:encoded><![CDATA[<p>Today I needed to create unit test that checked if the NHibernate query was generated optimally.</p>
<p>Good thing is that, in case of an inefficient query, NHibernate puts a warning using log4net:</p>
<pre class="brush: csharp;">
log.Warn( &quot;firstResult/maxResults specified with collection fetch; applying in memory!&quot; );
</pre>
<p>I wanted something like this:</p>
<pre class="brush: csharp;">
[Test]
public void FindUsersBy_QueryWithLimit_LimitsOnSQLSide()
{
    using (LogChecker logChecker
        = new LogChecker(&quot;NHibernate&quot;, Level.Warn))
    {
        // Execute query using NHibernate

        // ....

        Assert.IsEmpty(logChecker.Messages);
    }
}
</pre>
<p>The problem is that it&#8217;s not that easy to attach MemoryAppender for a duration of unit test to the specified logger.</p>
<p>Anyway here&#8217;s the code:</p>
<pre class="brush: csharp;">
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;
        _logger.AddAppender(_appender);
        _previousLevel = _logger.Level;
        _logger.Level = levelToCheck;
    }

    public List&lt;string&gt; Messages
    {
        get
        {
            return new List&lt;LoggingEvent&gt;(_appender.GetEvents())
                  .ConvertAll(x =&gt; x.RenderedMessage);
        }
    }

    public void Dispose()
    {
        _logger.Level = _previousLevel;
        _logger.RemoveAppender(_appender);
    }
};
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lesnikowski.com/blog/index.php/programmatically-check-log4net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
