Search code examples
c#tddnunitlog4net

log4net and nunit tests, most basic example


I want to try log some app messages from my app. In this very situation I just want to force nunit to work with log4net. I found some example here http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html.

log4net is confugured in app.config like this:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

<log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
  </log4net>

And in my test code is following

[TestFixture]
class DomainTests
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
    public void LoggingTests()
    {            
        log4net.Config.XmlConfigurator.Configure(); 
    }

    [Test]
    public void BasicLogTest()
    {
        log.Error("write my log entry already");
    }

My test is passed but nothing is written inside log.txt file. What am I doing wrong?
I just want to make it as simple as possible to store messages like entering an application, exit application. Regards.


Solution

  • My best guess would be for you to do something like this:

    [TestFixture]
    class DomainTests
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
        public void LoggingTests()
        {            
            log4net.Config.XmlConfigurator.Configure(); 
        }
    
        [Test]
        public void BasicLogTest()
        {
            log.Error("write my log entry already");
        }
    
        [SetUp]
        RunBeforeAnyTests()
        {
            BasicConfigurator.Configure();
        }
    
        [TearDown]
        RunAfterAnyTests()
        {
            // ...
        }
    

    I'd also use the Log4Net.config file rather than the app.config file, it just seems cleaner. Here's an example log4net.config file:

    <log4net>
      <!-- A1 is set to be a LogFileAppender -->
      <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" >
        <param name="File" value="C:\logging\log.txt" />
        <file value="c:\logging\Main" />
        <appendToFile value="true" />
        <datePattern value="yyyyMMdd'.log'" />
        <rollingStyle value="Composite" />
        <staticLogFileName value="false" />
        <maxSizeRollBackups value="-1" />
        <maximumFileSize value="500MB" />
    
        <!-- A1 uses PatternLayout -->
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
        </layout>
      </appender>
      <!-- Set root logger level to DEBUG and its only appender to LogFileAppender -->
      <root>
        <!--<level value="OFF" />-->
        <!--<level value="FATAL" />-->
        <!--<level value="ERROR" />-->
        <!--<level value="WARN" />-->
        <!--<level value="INFO" />-->
        <level value="DEBUG" />
        <!--<level value="ALL" />-->
        <appender-ref ref="LogFileAppender" />
      </root>
    </log4net>