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.