I’ve just been looking at logging info from MVC sites through to ASP.NET’s trace.axd handler. Here’s what you need to do.
1) Install log4net from NuGet;
Install-Package log4net
2) Tell log4net to read its config from XML – specifically, from your web.config file;
// Global.asax.cs;
protected void Application_Start()
{
...
XmlConfigurator.Configure();
...
}
3) Update web.config with three sections – one to register the log4net element, the log4net config itself, and the ‘trace’ element to turn on asp.net tracing;
web.config, part 1 — register the config section;
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
web.config, part 2 — add the log4net element under <configuration>;
<log4net debug="true">
<!-- writes to normal .net trace, eg DBGVIEW.exe, VS Output window -->
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level - %message%newline" />
</layout>
</appender>
<!-- writes to ASP.NET Tracing, eg Trace.axd -->
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!-- writes errors to the event log -->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<applicationName value="AI Track Record" />
<threshold value="ERROR" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AspNetTraceAppender" />
<appender-ref ref="EventLogAppender" />
<appender-ref ref="TraceAppender" />
</root>
</log4net>
web.config, part 3 – enable trace element in <configuration> / <system.web>
<configuration>
<system.web>
<trace writeToDiagnosticsTrace="true" enabled="true" pageOutput="false" requestLimit="250" mostRecent="true" />
<system.web>
</configuration>
4) Finally, to actually use the log, you need to create a logger;
// maybe add this to each class, or to be fancy, inject using Ninject; private static readonly ILog log = LogManager.GetLogger(typeof(MyClassName));
and write to it using methods like Info, Debug, etc;
log.Debug("Here's my excellent message");
5) Check Trace.axd! You’ll see your messages written to the ‘Trace Information’ section
Summary
Things to note — each appender has its own format, in the <converstionPattern> element, and its own ‘seriousness’, in the <threshold> element. So you can set up fine-grained control, like logging absolutely everything to a file and only errors to event log, or writing sparse information to trace.axd while writing verbose messages to a database table.