Lessons in this course (8)

5. NLog and log4net (including .NET Framework apps)

IntermediateMediumLesson 5 of 8

NLog — configuration-driven (nlog.config), many targets, layouts:

xml
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets async="true">
    <target xsi:type="File" name="file" fileName="logs/${shortdate}.log"
            layout="${longdate}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
    <target xsi:type="Database" name="db" connectionString="${configsetting:ConnectionStrings.Logs}"
            commandText="INSERT INTO dbo.Logs (Logged, Level, Logger, Message, Exception) VALUES (@t, @l, @lg, @m, @e)">
      <parameter name="@t" layout="${date}" /><parameter name="@l" layout="${level}" />
      <parameter name="@lg" layout="${logger}" /><parameter name="@m" layout="${message}" /><parameter name="@e" layout="${exception:tostring}" />
    </target>
  </targets>
  <rules>
    <logger name="Microsoft.*" maxlevel="Info" final="true" />   <!-- drop noisy framework info -->
    <logger name="*" minlevel="Info" writeTo="file,db" />
  </rules>
</nlog>
csharp
builder.Logging.ClearProviders();
builder.Host.UseNLog();                     // NLog.Web.AspNetCore — ILogger<T> calls now go to NLog

log4net — common in .NET Framework (Web Forms/MVC 5/WCF) code:

xml
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="App_Data\Logs\app.log" /><appendToFile value="true" />
    <rollingStyle value="Date" /><datePattern value="yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception" /></layout>
  </appender>
  <root><level value="INFO" /><appender-ref ref="RollingFile" /></root>
</log4net>
csharp
// Global.asax Application_Start: log4net.Config.XmlConfigurator.Configure();
private static readonly ILog Log = LogManager.GetLogger(typeof(ProductsController));
Log.Info("Products page loaded");
Log.Error("Save failed", ex);

Built-in .NET Framework options: System.Diagnostics.Trace with listeners in web.config, EventLog.WriteEntry (Windows Event Viewer — needs a registered source), ASP.NET health monitoring, ELMAH (automatic unhandled-error logging with a web viewer /elmah.axd — protect it!).

SerilogNLoglog4netMS ILogger only
Structured loggingNative, bestGoodLimitedYes (depends on provider)
ConfigCode or JSONXML/JSONXMLJSON
Typical useModern .NETModern + FrameworkLegacy FrameworkSimple apps, with OpenTelemetry/App Insights