Examples of log4net PatternLayout output

.NET

log4net has a lot of options when it comes to defining what you write to your log. While all the patterns are documented, it is useful to see a sample output from some code. Here is the output produced from some of the patterns available:

PatternClass ‘BaseClass’Class ‘SubClass’
appdomainlog4netPatterns.vshost.exelog4netPatterns.vshost.exe
date2009-05-24 16:37:26,5782009-05-24 16:37:26,640
fileC:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.csC:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.cs
identity  
locationlog4netPatterns.BaseClass`1.MyMethod(C:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.cs:32)log4netPatterns.SubClass.MyMethod(C:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.cs:49)
levelDEBUGDEBUG
line3249
loggerlog4netPatterns.BaseClass`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]log4netPatterns.SubClass
messageBaseClassSubClass
methodMyMethodMyMethod
property{log4net:HostName=morgan}{log4net:HostName=morgan}
timestamp4596846015
thread21162116
typelog4netPatterns.BaseClass`1log4netPatterns.SubClass
usernameMORGAN\DavidMORGAN\David
utcdate2009-05-24 07:14:41,4682009-05-24 07:14:41,515

Of particular interest is the difference between logger and type. For the SubClass class, they result in the same output, but for the BaseClass logger is a lot more verbose (especially if your generic type happens to be from a strongly-signed assembly!). Using logger will give more detailed information but at the expense of larger log files.

Methodology

Because some of the patterns vary their output if you are in a base class or an inherited class, I created a simple class hierarchy, and also included use of generics.

public class BaseClass<T>
{
   private ILog _log;

   public BaseClass()
   {
       _log = LogManager.GetLogger(typeof (BaseClass<T>));
   }

   public virtual string MyMethod(T stuff)
   {
       _log.Debug("BaseClass");

       return "ha";
   }
}

public class SubClass : BaseClass<string>
{
   private ILog _log;

   public SubClass()
   {
       _log = LogManager.GetLogger(typeof (SubClass));
   }

   public override string MyMethod(string stuff)
   {
       _log.Debug("SubClass");

       return "ho ho";
   }
}

The project that included this code was strongly signed, to allow any effect this might cause to be evident.