Log Strutturati vs Non Strutturati in .NET: Le Basi

Alessandro Mengoli

Log Strutturati vs Non Strutturati in .NET: Le Basi

Ogni sviluppatore sa quanto sia cruciale avere dei buoni log per capire cosa succede all’interno delle proprie applicazioni. Ma cosa significa veramente “buoni log”? E soprattutto, come possiamo evolverci dal logging tradizionale a quello strutturato?

Cosa sono i Log Non Strutturati?

Immagina di tenere un diario della tua applicazione. Proprio come scriveresti “Oggi ho pranzato con Marco alle 13:00”, nel codice scriviamo:

_logger.LogInformation($"Utente {userId} ha effettuato l'accesso alle {DateTime.Now}");
_logger.LogError($"Errore durante il processing dell'ordine {orderId}: {errorMessage}");

Questo produrrà un output testuale come:

[2024-11-19 15:30:45 INF] Utente 12345 ha effettuato l'accesso alle 19/11/2024 15:30:45
[2024-11-19 15:31:02 ERR] Errore durante il processing dell'ordine ORD-789: Validazione fallita

Questi sono i log non strutturati: messaggi in linguaggio naturale, perfetti per essere letti da noi sviluppatori. Come in un diario, annotiamo gli eventi importanti in forma di testo libero, esattamente come li racconteremmo a un collega.

Ma qui emerge il limite: mentre questi messaggi sono immediatamente comprensibili per un umano, per una macchina sono solo lunghe stringhe di testo. Come potrebbe un sistema automatico sapere quale parte del messaggio è l’ID dell’ordine o l’ora esatta dell’evento? È come avere un diario bellissimo ma impossibile da indicizzare o ricercare efficacemente.

L’Evoluzione: Log Strutturati

I log strutturati nascono proprio per superare questo limite, mantenendo la leggibilità per gli umani ma aggiungendo la comprensibilità per le macchine. Il codice cambia leggermente:

_logger.LogInformation("Utente {UserId} ha effettuato l'accesso alle {LoginTime}", 
    userId, 
    DateTime.Now);

Questo produrrà un output che può essere salvato in formato JSON:

{
  "Timestamp": "2024-11-19T15:30:45.123Z",
  "Level": "Information",
  "Message": "Utente 12345 ha effettuato l'accesso alle 19/11/2024 15:30:45",
  "Properties": {
    "UserId": "12345",
    "LoginTime": "2024-11-19T15:30:45.123Z"
  }
}

Può sembrare simile quando lo leggiamo, ma c’è una differenza fondamentale: ogni parametro viene salvato come un dato strutturato, con il suo tipo e il suo contesto. È come passare da un diario scritto a mano a un’agenda digitale: le informazioni sono le stesse, ma ora possiamo facilmente cercare, filtrare e analizzare ogni singolo dato.

Vantaggi dei Log Strutturati

  1. Ricercabilità: Puoi cercare facilmente tutti gli eventi relativi a uno specifico ID utente o ordine
  2. Aggregazione: Puoi calcolare statistiche e metriche basate sui dati dei log
  3. Filtraggio: Puoi filtrare gli eventi basandoti su qualsiasi proprietà
  4. Analisi: Puoi eseguire query complesse sui tuoi log
  5. Monitoring: Puoi creare alert e dashboard basati su pattern specifici

Conclusione

Il passaggio ai log strutturati è come evolvere dal diario cartaceo a un sistema di documentazione moderno: manteniamo la chiarezza e l’immediatezza della narrazione, ma aggiungiamo la potenza dell’analisi digitale. Non è una questione di scegliere tra leggibilità umana e efficienza computazionale - possiamo avere entrambe.

Nel prossimo articolo della serie, esploreremo gli strumenti moderni che ci permettono di implementare e sfruttare al meglio i log strutturati nelle nostre applicazioni .NET.

#dotnet
#logging
#best-practices