Examples of log4net PatternLayout output
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:
Pattern | Class ‘BaseClass’ | Class ‘SubClass’ |
---|---|---|
appdomain | log4netPatterns.vshost.exe | log4netPatterns.vshost.exe |
date | 2009-05-24 16:37:26,578 | 2009-05-24 16:37:26,640 |
file | C:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.cs | C:\Dev\GoogleCode-Gardiner\trunk\Log4netPatterns\log4netPatterns\Program.cs |
identity | ||
location | log4netPatterns.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) |
level | DEBUG | DEBUG |
line | 32 | 49 |
logger | log4netPatterns.BaseClass`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] | log4netPatterns.SubClass |
message | BaseClass | SubClass |
method | MyMethod | MyMethod |
property | {log4net:HostName=morgan} | {log4net:HostName=morgan} |
timestamp | 45968 | 46015 |
thread | 2116 | 2116 |
type | log4netPatterns.BaseClass`1 | log4netPatterns.SubClass |
username | MORGAN\David | MORGAN\David |
utcdate | 2009-05-24 07:14:41,468 | 2009-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.
Categories: .NET