Skip to main content

Log Strutturati vs Non Strutturati in .NET: Le Basi

Alessandro Mengoli
Serie: Observability .NET - Parte 2

Log Strutturati vs Non Strutturati in .NET: Le Basi

La scrittura dei log è una pratica adottata da moltissimo tempo ma non sempre vengono scritti buoni log. Avere dei buoni log aiuta in maniera importante ogni sviluppatore ad avere un’idea di cosa sta accadendo nelle proprie applicazioni. Gli strumenti di ricerca nei log diventano sempre più avanzati e fortunatamente non siamo più costretti a cercare i log facendo ricerche testuali in file ma dovremmo poter avere la facoltà di poter fare ricerche sia sul testo che sui parametri associati al log. Occorre perciò evolvere la scrittura dei log da quelli tradizionali non strutturati a quelli strutturati per migliorare le modalità di accesso al dato.

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? O come potremmo fare ricerche sull’ID in maniera precisa e sicura senza dover andare a fare regex nel codice? È 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, evitando l’interpolazione di stringhe:

_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. Observability: Sono adatti per i moderni backend di observability

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.