Un esempio di come usare NLog in un progetto .NET Core 3.1.

Per prima cosa importare i pacchetti Nuget necessari:

XML

<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.8" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.8" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.8" />
<PackageReference Include="NLog" Version="4.7.4" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.5" />

Poi vanno registrate le dipendenze, i servizi e NLog nel file Program.cs:

C#: Program.cs

using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;

namespace Sgart.NLog
{
  class Program
  {
    static void Main(string[] args)
    {
			try
			{
				var host = GetHost();

				using (var serviceScope = host.Services.CreateScope())
				{
					var services = serviceScope.ServiceProvider;

					// creo la app
					var runner = services.GetRequiredService<SgartTestLogService>();
					runner.Run().Wait();
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
				throw ex;
			}
			finally
			{
				NLog.LogManager.Shutdown();
			}
		}


		private static IHost GetHost()
		{
			var hostBuilder = new HostBuilder()
			  .ConfigureServices((hostContext, services) =>
			  {
				  // specifico qual'è il file con la configurazione di NLog
				  IConfigurationRoot configuration = new ConfigurationBuilder()
					 .SetBasePath(System.IO.Directory.GetCurrentDirectory())
					 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
					 .Build();
				  // aggiungo la configurazione di NLog
				  NLog.LogManager.Configuration = new NLog.Extensions.Logging.NLogLoggingConfiguration(configuration.GetSection("NLog"));
				  services.AddSingleton<IConfiguration>(configuration);

				  // dependency injection / custom class
				  services.AddTransient<SgartTestLogService>();
				  //services.AddSingleton<ServerApp.DBService>();
			  })
			  .ConfigureLogging(logBuilder =>
			  {
				  logBuilder.SetMinimumLevel(LogLevel.Trace);
				  // aggiungo NLog
				  logBuilder.AddNLog();
			  }).UseConsoleLifetime();

			return hostBuilder.Build();
		}
	}
}
questa è una classe di esempio (SgartTestLogService) creata nel main tramite la dependency injection che scrive nel log (c:/logs/Sgart.NLog/internal.log):

C#: SgartTestLogService.cs

namespace Sgart.NLog
{
  public class SgartTestLogService
  {
		private readonly ILogger<SgartTestLogService> _logger;

		public SgartTestLogService(ILogger<SgartTestLogService> logger)
		{
			_logger = logger;
			_logger.LogInformation("SgartTestLogService starting ...");
		}

		public async Task Run()
		{
			_logger.LogTrace("Running begin ...");
			//...
			_logger.LogTrace("Running end");
		}
  }
}
infine va configurato il file appsettings.json con le impostazioni per NLog:

JSON: appsettings.json

{
    "Logging": {
        "LogLevel": {
            "Default": "Trace",
            "System": "Information",
            "Microsoft": "Information"
        },
        "NLog": {
            "IncludeScopes": true
        }
    },
    "NLog": {
        "throwConfigExceptions": true,
        "autoReload": "true",
        "internalLogLevel": "info",
        "internalLogFile": "c:/logs/Sgart.NLog/internal.log",
        "targets": {
            "log-console": {
                "type": "Console"
            },
            "all-file": {
                "type": "File",
                "fileName": "c:/logs/Sgart.NLog/all-${shortdate}.log",
                "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"

            },
            "log-trace": {
                "type": "Trace"
            }
        },
        "rules": [
            {
                "logger": "*",
                "minLevel": "Trace",
                "writeTo": "log-console"
            },
            {
                "logger": "*",
                "minLevel": "Debug",
                "writeTo": "all-file"
            },
            {
                "logger": "*",
                "minLevel": "Trace",
                "writeTo": "log-trace"
            }
        ]
    }
}
In Visual Studio impostare nelle property del file appsettings.json il parametro Copy to Output Directory su copy always.
Nel file di log, salvato con un nome simile a questo all-2020-09-16.log, viene scritta una riga come tipo:

Text

2020-09-16 23:58:24.6073||INFO|Sgart.NLog.SgartTestLogService|SgartTestLogService starting ... 
Nel caso servisse usare il log in una classe statica, si può referenziale il logger in questo modo:

C#: Helper.cs

namespace Sgart.NLog
{
  public static class Helper
  {
    private static readonly ILogger _logger = ApplicationLogging.CreateLogger("Helper");
    ...
  }
}
usando questa classe:

C#: ApplicationLogging.cs

namespace Sgart.NLog
{
    internal static class ApplicationLogging
    {
        internal static ILoggerFactory LoggerFactory { get; } = new LoggerFactory();
        internal static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>();
        internal static ILogger CreateLogger(string categoryName) => LoggerFactory.CreateLogger(categoryName);
    }
}

Vedi anche Usare NLog in una web application Net 5.
Tags:
.NET66 .NET Core26 Visual Studio37
Potrebbe interessarti anche: