Skip to content

Getting started with .NET Core 2 Console application

Rolf Kristensen edited this page Jun 22, 2019 · 25 revisions

⚠️ ASP.NET Core users should use the ASP.NET Core 2 tutorial

Description

Explains how to setup NLog as logging provider for .NET Core and Microsoft Extension Logging (MEL).

Demonstrated with a Console application. Example project can also be found on GitHub.

Notice that NLog can be used on .NET Core without help from Microsoft Extension Logging and NLog.Extension.Logging. See Pure NLog Tutorial.

0. Create a new .NET Core console project

In Visual Studio 2017, using .NET 4.6.1+ or .NET Core 2

image

1. Add dependency in csproj manually or using NuGet

Install:

e.g.

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.0" />
    <PackageReference Include="NLog" Version="4.6.2" />
    <PackageReference Include="NLog.Extensions.Logging" Version="1.4.0" />
  </ItemGroup>

2. Create a nlog.config file.

Create nlog.config (lowercase all) file in the root of your application project (File Properties: Copy Always)

We use this example:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogFile="c:\temp\console-example-internal.log"
      internalLogLevel="Info" >

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="target1" fileName="c:\temp\console-example.log"
            layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
    <target xsi:type="Console" name="target2"
            layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <logger name="*" minlevel="Trace" writeTo="target1,target2" />
  </rules>
</nlog>

It is recommended to read the NLog Tutorial. For more detailed information about config file can be found here.

If you like to include other targets or layout renderers, check the Platform support.

3. Update your program

3.1 Create your runner class

 public class Runner
 {
     private readonly ILogger<Runner> _logger;

     public Runner(ILogger<Runner> logger)
     {
         _logger = logger;
     }

     public void DoAction(string name)
     {
         _logger.LogDebug(20, "Doing hard work! {Action}", name);
     }
 }

3.2 Setup the Dependency injector (DI) container

private static IServiceProvider BuildDi(IConfiguration config)
{
   return new ServiceCollection()
      .AddTransient<Runner>() // Runner is the custom class
      .AddLogging(loggingBuilder =>
      {
            // configure Logging with NLog
            loggingBuilder.ClearProviders();
            loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            loggingBuilder.AddNLog(config);
      })
      .BuildServiceProvider();
}

3.3 Update your main()

First create the DI container, then get your Runner and start running!

static void Main(string[] args)
{
   var logger = LogManager.GetCurrentClassLogger();
   try
   {
      var config = new ConfigurationBuilder()
         .SetBasePath(System.IO.Directory.GetCurrentDirectory())
         .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
         .Build();

      var servicesProvider = BuildDi(config);
      using (servicesProvider as IDisposable)
      {
         var runner = servicesProvider.GetRequiredService<Runner>();
         runner.DoAction("Action1");

         Console.WriteLine("Press ANY key to exit");
         Console.ReadKey();
      }
   }
   catch (Exception ex)
   {
      // NLog: catch any exception and log it.
      logger.Error(ex, "Stopped program because of exception");
      throw;
   }
   finally
   {
      // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
      LogManager.Shutdown();
   }
}

4 Example output

On screen:

image

In file:

2017/10/16 23:08:46.479|DEBUG|Doing hard work! Action1 |ConsoleExample.Runner|Action=Action1, EventId_Id=20, EventId_Name=, EventId=20

Configure NLog Targets for output

Next step, see Configure NLog with nlog.config