Usare NLog in una console application Net Core 3.1
Un esempio di come usare NLog in un progetto .NET Core 3.1.
Per prima cosa importare i pacchetti Nuget necessari:
Poi vanno registrate le dipendenze, i servizi e NLog nel file Program.cs:
questa è una classe di esempio (SgartTestLogService) creata nel main tramite la dependency injection che scrive nel log (c:/logs/Sgart.NLog/internal.log):
infine va configurato il file appsettings.json con le impostazioni per NLog:
Nel caso servisse usare il log in una classe statica, si può referenziale il logger in questo modo:
usando questa classe:
Vedi anche Usare NLog in una web application Net 5.
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();
}
}
}
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");
}
}
}
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 ...
C#: Helper.cs
namespace Sgart.NLog
{
public static class Helper
{
private static readonly ILogger _logger = ApplicationLogging.CreateLogger("Helper");
...
}
}
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.