Skip to content

Getting started with .NET Core 2 Console application

Julian Verdurmen edited this page Oct 16, 2017 · 25 revisions

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


ℹ️ See also example in GitHub


How to use for .NET Core with csproj (VS2017 only) - demonstrated with a Console application

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:

2. Create a nlog.config file.

Create nlog.config (lowercase all) file in the root of your project.

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>

More details of the config file are here.

If you like to include other targets or layout renderers, check the Platform support table, as there is a limited set implemented. Check the column NetStandard 1.3. To read more about NetStandard, see the docs from Microsoft

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()
 {
     var services = new ServiceCollection();

     //Runner is the custom class
     services.AddTransient<Runner>();

     services.AddSingleton<ILoggerFactory, LoggerFactory>();
     services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
     
     var serviceProvider = services.BuildServiceProvider();

     var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

     //configure NLog
     loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties =true });
     loggerFactory.ConfigureNLog("nlog.config"); 

     return serviceProvider;
 }

3.3 Update your main()

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

static void Main(string[] args)
{
    var servicesProvider = BuildDi();
    var runner = servicesProvider.GetRequiredService<Runner>();

    runner.DoAction("Action1");

    Console.WriteLine("Press ANY key to exit");
    Console.ReadLine();
}