Un sistema di logging è necessario ogni volta che sia ha la necessità di registrare sequenzialmente una serie di operazioni, man mano che queste vengono eseguite. Per poter memorizzare le operazioni ( e tutte le informazioni nel dettaglio) è necessario definire dove dovranno essere memorizzate.
In .Net Core 5 (tratterò la versione 6 in un articolo futuro), le funzionalità di logging possono essere gestite utilizzando l’interfaccia ILogger del namespace Microsoft.Extensions.Logging.
Questa interfaccia ha fatto la sua prima comparsa all’interno di .NET Core, successivamente è stata integrata all’interno di .NET Standard e successivamente portata anche nelle versioni successive del framework (in questo caso stiamo parlando del framework 5.0).
Inoltre, interfaccia consente di effettuare registrazione dei log attraverso alcuni logging provider predefiniti e già presenti all’interno del framework, oppure utilizzando logging provider di terze parti.
Un logging provider è un componente che permette di memorizzare o visualizzare i log all’interno di oggetti differenti. E’ possibile ad esempio utilizzare un logging provider per la visualizzazione dei log direttamente nella console dell’applicazione (Console Provider).

Il framework di .NET mette a disposizione per lo sviluppatore una serie di logging provider di default:
- Console: visualizzazione all’interno della console dell’applicazione
- Debug: visualizzazione dei log all’interno dell’ambiente di debug
- EventSource: log che possono essere interecettati da strumenti appositi (es. ETW di Windows)
- EventLog: log che vengono intercettati all’interno del registo eventi di Windows (solo Windows)
- AzureAppServicesFile: specifico per ambiente azure
- AzureAppServicesBlob: specifico per ambiente azure
- ApplicationInsights: specifico per l’ambiente azure
Gli ultimi tre logging provider si riferisco all’ambiente azure.
Nel caso in cui l’applicazione sia deployata all’interno di Azure, si può utilizzare Azure Application Insights per le operazioni di monitoraggio.
Inoltre ciascuno dei logging provider visti in precedenza (ed eventualmente quelli di terze parti), possono essere abilitati indipendentemente l’uno dall’altro. In un’applicazione tipica ASP.NET Core troviamo abilitati:
- Console
- Debug
- EventSource
- EventLog (solo se l’applicazione è in ambiente Windows)
E’ anche possibile utilizzare librerie di terze parti, presenti all’interno di nuget.
Spesso può essere necessario log a database come ad esempio Sql Server e Mysql.
Analizzando un’applicazione .NET Core 5 all’interno del file appsettings.json troviamo la configurazione (seppure molto semplice) del sistema di logging.
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},In questo caso viene specificato il LogLevel e non è presente nessuna particolare indicazione sul tipo di logging provider a cui fa riferimento. Inoltre, tutti i logging provider avranno lo stesso LogLevel.
LogLevel
Il framework mette a disposizione i seguenti LogLevel: Trace, Debug, Information, Warning, Error, Critical e None.
- Trace (0): loglevel a basso livello. Da utilizzare solo all’interno di analisi approfondite
- Debug (1): loglevel utilizzato prevalentemente durante lo sviluppo. Da disabilitare al momento della messa in produzione dell’applicazione
- Information (2): loglevel informativi relativi alla normale esecuzione dell’applicazione
- Warning (3): loglevel per la registrazione di comporamenti anomali ma non critici per l’esecuzione dell’applicazione
- Error (4): loglevel per la registrazione di errori critici che impediscono l’esecuzione dell’attività corrente
- Critical (5): loglevel per la registrazione di eventi che determinano l’arresto anomalo dell’applicazione
- None (6): nessuna registrazione
Il LogLevel rappresenta il livello minimo per cui verrà effettuato il log, nella categoria selezionata.
A questo punto è sufficiente aggiungere i log provider all’interno del file Program.cs :
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}aggiungendo, ad esempio :
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
}).Da notare che viene anche indicato il nome della proprietà presente all’interno del file appsettings.json.