Ci sono due progressi fondamentali con l' approccio strutturato che non possono essere emulati usando i log di testo senza (a volte livelli estremi di) ulteriore sforzo.
Tipi di eventi
Quando scrivi due eventi con log4net come:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
Questi produrranno un testo simile:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Ma per quanto riguarda l'elaborazione automatica, sono solo due righe di testo diverso.
Potresti voler trovare tutti gli eventi "quota disco superata", ma il caso semplicistico di cercare eventi like 'Disk quota%'
cadrà non appena si verifica un altro evento simile a:
Disk quota 100 set for user DTI-Matt
La registrazione del testo elimina le informazioni che abbiamo inizialmente sulla fonte dell'evento e questo deve essere ricostruito quando si leggono i registri di solito con espressioni di corrispondenza sempre più elaborate.
Al contrario, quando scrivi i seguenti due eventi Serilog :
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Questi producono un output di testo simile alla versione log4net, ma dietro le quinte, il "Disk quota {Quota} exceeded by user {Username}"
modello di messaggio viene portato da entrambi gli eventi.
Con un sink appropriato, è possibile in seguito scrivere query where MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
e ottenere esattamente gli eventi in cui è stata superata la quota del disco.
Non è sempre conveniente archiviare l'intero modello di messaggio con ogni evento di registro, quindi alcuni sink eseguono l'hash del modello di messaggio in un EventType
valore numerico (ad esempio 0x1234abcd
), oppure è possibile aggiungere un enricher alla pipeline di registrazione per farlo da soli .
È più sottile della successiva differenza di seguito, ma è enormemente potente quando si tratta di grandi volumi di log.
Dati strutturati
Ancora una volta, considerando i due eventi sull'utilizzo dello spazio su disco, potrebbe essere abbastanza semplice utilizzare i log di testo per eseguire query per un determinato utente like 'Disk quota' and like 'DTI-Matt'
.
Ma la diagnostica di produzione non è sempre così semplice. Immagina che sia necessario trovare eventi in cui la quota del disco superata fosse inferiore a 125 MB?
Con Serilog, questo è possibile nella maggior parte dei lavandini usando una variante di:
Quota < 125
Costruire questo tipo di query da un'espressione regolare è possibile, ma diventa stancante e di solito finisce per essere l'ultima misura.
Ora aggiungi a questo un tipo di evento:
Quota < 125 and EventType = 0x1234abcd
Inizierai a vedere qui come queste funzionalità si combinano in modo semplice per far sembrare il debug della produzione con i log un'attività di sviluppo di prima classe.
Un ulteriore vantaggio, forse non così facile da prevenire in anticipo, ma una volta che il debug della produzione è stato rimosso dalla terra degli hacker regex, gli sviluppatori iniziano a valutare molto di più i log e ad esercitare più attenzione e considerazione quando li scrivono. Registri migliori -> applicazioni di migliore qualità -> maggiore felicità.