Configuring a logger¶
1. install log4net in the package manager console¶
PM> Install-Package log4net
Attempting to gather dependency information for package 'log4net.2.0.8' with respect to project 'logApp', targeting '.NETFramework,Version=v4.6.1'
Gathering dependency information took 17.01 ms
Attempting to resolve dependencies for package 'log4net.2.0.8' with DependencyBehavior 'Lowest'
Resolving dependency information took 0 ms
Resolving actions to install package 'log4net.2.0.8'
Resolved actions to install package 'log4net.2.0.8'
Retrieving package 'log4net 2.0.8' from 'nuget.org'.
Adding package 'log4net.2.0.8' to folder 'C:\Users\kcorcoran\Desktop\git-repos\personal\Logging\packages'
Added package 'log4net.2.0.8' to folder 'C:\Users\kcorcoran\Desktop\git-repos\personal\Logging\packages'
Added package 'log4net.2.0.8' to 'packages.config'
Successfully installed 'log4net 2.0.8' to logApp
Executing nuget actions took 4.16 sec
Time Elapsed: 00:00:05.6578325
2. create a configuration file for log4net¶
-
Add a file called
log4net.configto the solution, see example here -
Set the property on the file "Copy to Output Directory" to be "Copy Always" as below

Tell the application to load the configuration file¶
Append to the bottom of AssemblyInfo.cs to tell the application to load the configuration.
// log4net config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
3. registering a logger with the service class¶
Using the RegisterLogger method of the Service class, we can specify a logger to register with the Service class. An example implementation of logger that can be registered is provided here.
Using this, you can register a logger in your application as follows
Service.RegisterLogger(new Log4NetTraceListener(), SourceLevels.All, true);
This enables trace logging for the Service.
Troubleshooting¶
Debugging log4net¶
If the logging is not behaving as expected, then the internal logging of log4net can be turn on by adding the following key to your App.config in <appSettings>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true" />
...
then specify where this log should be written to by adding
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
Appendix¶
log4net confg example¶
<log4net>
<!-- Configure the appender references -->
<root>
<level value="TRACE" />
<appender-ref ref="TraceRootRollingFileAppender"/>
<appender-ref ref="DebugRootRollingFileAppender"/>
<appender-ref ref="ErrorWarnRootRollingFileAppender"/>
<appender-ref ref="InfoRootRollingFileAppender"/>
</root>
<!-- TRACE -->
<appender name="TraceRootRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\trace.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="10000KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
<threshold value="Trace"/>
</appender>
<!-- DEBUG -->
<appender name="DebugRootRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\debug.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="100000000KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
<threshold value="DEBUG"/>
</appender>
<!-- ERRORWARN -->
<appender name="ErrorWarnRootRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\errorwarn.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="5"/>
<maximumFileSize value="10000KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
<threshold value="WARN"/>
</appender>
<!-- INFO -->
<appender name="InfoRootRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\info.log"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="5"/>
<maximumFileSize value="10000KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%-5thread] %-5level %logger - %message%newline"/>
</layout>
<threshold value="INFO"/>
</appender>
</log4net>
Trace listener class¶
using DaaSCsApiCore;
using log4net;
using log4net.Core;
using System;
using System.Diagnostics;
namespace logApp
{
class Log4NetTraceListener : TraceListener
{
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args)
{
ILog log = LogManager.GetLogger(source);
Type type = Type.GetType(source);
switch (eventType)
{
case TraceEventType.Critical:
log.FatalFormat(format, args);
break;
case TraceEventType.Error:
log.ErrorFormat(format, args);
break;
case TraceEventType.Information:
log.Logger.Log(Type.GetType(source), Level.Info, string.Format(format, args), null);
log.InfoFormat(format, args);
break;
case TraceEventType.Warning:
log.WarnFormat(format, args);
break;
case TraceEventType.Verbose:
if (id == (int)LogID.TRACE)
log.Logger.Log(Type.GetType(source), Level.Trace, string.Format(format, args), null);
else
log.DebugFormat(format, args);
break;
default:
log.InfoFormat(format, args);
break;
}
}
/// <summary>
/// Required Write method override. Note that this method should never be called.
/// </summary>
/// <param name="message"></param>
public override void Write(string message)
{
Debug.Assert(false, string.Format("Error: Write method called with message: {0}", message));
}
/// <summary>
/// Required WriteLine method override. Note that this method should never be called.
/// </summary>
/// <param name="message"></param>
public override void WriteLine(string message)
{
Debug.Assert(false, string.Format("Error: WriteLine method called with message: {0}", message));
}
}
}