Build ASP.NET Core Website

Last Updated: 7/1/2025

File Logging using NLog

Steps

  • Install NLog.Web.AspNetCore
  • Create nlog.config in project root
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogLevel="Info"
      internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- File Target for all log messages with basic details -->
    <target xsi:type="File" name="allfile" fileName="logs/nlog-AspNetCore-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

    <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="logs/nlog-AspNetCore-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

    <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
    <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!-- All logs, including from Microsoft -->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!-- Suppress output from Microsoft framework when non-critical -->
    <logger name="System.*" finalMinLevel="Warn" />
    <logger name="Microsoft.*" finalMinLevel="Warn" />
    <!-- Keep output from Microsoft.Hosting.Lifetime to console for fast startup detection -->
    <logger name="Microsoft.Hosting.Lifetime*" finalMinLevel="Info" writeTo="lifetimeConsole" />

    <logger name="*" minLevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>
  • In the config file, you can update minLevel for loggers to your needs
  • Update the file location in the targets if required
  • Program.cs changes
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();

var builder = WebApplication.CreateBuilder(args);

builder.Logging.ClearProviders();
builder.Host.UseNLog();

Deployment

  • When deploying in production server, make sure you have write access to logs folder
  • If you are hosting in plesk, give Application pool group write permission.

https://docs.plesk.com/en-US/obsidian/administrator-guide/website-management/websites-and-domains/website-content/changing-file-and-directory-access-permissions-in-file-manager.70738/