Ci sono due fondamentali progressi con l'approccio strutturato che non possono essere emulati usando log di testo senza (a volte livelli estremi di) sforzo aggiuntivo.
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");
Ciò produrrà un testo simile:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Ma, per quanto riguarda l'elaborazione della macchina, sono solo due righe di testo differente.
Potresti voler trovare tutti gli eventi di "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 getta via le informazioni che abbiamo inizialmente sulla fonte dell'evento, e questo deve essere ricostruito durante la lettura dei registri di solito con espressioni di corrispondenza sempre più elaborate.
Al contrario, quando scrivi i seguenti due Serilog eventi:
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Producono output di testo simile alla versione di 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, puoi 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 memorizzare l'intero modello di messaggio con ogni evento di registro, quindi alcuni sink hanno cancellato il modello del messaggio in un valore numerico EventType
(ad esempio 0x1234abcd
), oppure, puoi aggiungere un enricher alla pipeline di registrazione per fai da te .
È più sottile rispetto alla successiva differenza di seguito, ma è potente in modo massiccio quando si gestiscono volumi di registro di grandi dimensioni.
Dati strutturati
Considerando nuovamente i due eventi sull'utilizzo dello spazio su disco, potrebbe essere abbastanza semplice utilizzare i registri di testo per eseguire una query per un particolare utente con like 'Disk quota' and like 'DTI-Matt'
.
Ma la diagnostica di produzione non è sempre così semplice. Immagina di dover trovare eventi in cui la quota disco superata è 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 faticoso e di solito finisce per essere una misura di ultima istanza.
Ora aggiungi a questo un tipo di evento:
Quota < 125 and EventType = 0x1234abcd
Inizi a vedere qui come queste capacità si combinano in un modo semplice per rendere il debugging della produzione con i log come un'attività di sviluppo di prima classe.
Un ulteriore vantaggio, forse non così facile da prevenire in anticipo, ma una volta che il debugging della produzione è stato rimosso dalla terra dell'hackery regex, gli sviluppatori iniziano a valutare molto più i log e ad esercitare maggiore attenzione e considerazione quando li scrivono. Registri migliori - > applicazioni di qualità migliore - > più felicità tutt'intorno.