Der strukturierte Ansatz bringt zwei grundlegende Fortschritte mit sich, die mit Textprotokollen nicht ohne (manchmal extremen) zusätzlichen Aufwand emuliert werden können.
Ereignistypen
Wenn Sie mit log4net zwei Ereignisse schreiben, wie:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
Diese erzeugen ähnlichen Text:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Bei der maschinellen Verarbeitung handelt es sich jedoch nur um zwei Zeilen mit unterschiedlichem Text.
Möglicherweise möchten Sie alle "Datenträgerkontingent überschritten" -Ereignisse finden, aber der vereinfachte Fall der Suche nach Ereignissen like 'Disk quota%'
wird fallen, sobald ein anderes Ereignis eintritt, das wie folgt aussieht:
Disk quota 100 set for user DTI-Matt
Die Textprotokollierung wirft die Informationen weg, die wir ursprünglich über die Quelle des Ereignisses haben, und diese müssen rekonstruiert werden, wenn die Protokolle in der Regel mit immer ausgefeilteren Übereinstimmungsausdrücken gelesen werden.
Im Gegensatz dazu, wenn Sie die folgenden zwei Serilog- Ereignisse schreiben :
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Diese erzeugen eine ähnliche Textausgabe wie die log4net-Version, hinter den Kulissen wird die "Disk quota {Quota} exceeded by user {Username}"
Nachrichtenvorlage jedoch von beiden Ereignissen übertragen.
Mit einer geeigneten Senke können Sie später Abfragen schreiben where MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
und genau die Ereignisse abrufen, bei denen das Datenträgerkontingent überschritten wurde.
Es ist nicht immer bequem , die gesamte Nachrichtenvorlage mit jedem Protokollereignis zu speichern, so dass einige Senken hash die Nachrichtenvorlage in einen numerischen EventType
Wert (zB 0x1234abcd
), oder können Sie eine enricher in die Protokollierungs Pipeline in den dies selbst zu tun .
Es ist subtiler als der nächste Unterschied, aber bei großen Log-Volumes enorm leistungsfähig.
Strukturierte Daten
Unter Berücksichtigung der beiden Ereignisse zur Speicherplatznutzung ist es möglicherweise einfach genug, Textprotokolle zu verwenden, um nach einem bestimmten Benutzer mit abzufragen like 'Disk quota' and like 'DTI-Matt'
.
Die Produktionsdiagnose ist jedoch nicht immer so einfach. Stellen Sie sich vor, es ist notwendig, Ereignisse zu finden, bei denen das Festplattenkontingent unter 125 MB lag?
Mit Serilog ist dies in den meisten Spülbecken mit einer Variante von:
Quota < 125
Die Erstellung einer solchen Abfrage aus einem regulären Ausdruck ist möglich, wird jedoch schnell müde und ist in der Regel ein Maß für den letzten Ausweg.
Fügen Sie nun einen Ereignistyp hinzu:
Quota < 125 and EventType = 0x1234abcd
Hier sehen Sie, wie diese Funktionen auf einfache Weise kombiniert werden, damit das Debuggen in der Produktion mit Protokollen als erstklassige Entwicklungsaktivität empfunden wird.
Ein weiterer Vorteil, der vielleicht nicht so einfach zu verhindern ist, aber nachdem das Debuggen in der Produktion aus dem Land der Regex-Hacker herausgenommen wurde, beginnen die Entwickler, Protokolle viel mehr zu bewerten und beim Schreiben mehr Sorgfalt und Überlegung walten zu lassen. Bessere Protokolle -> Anwendungen mit besserer Qualität -> Rundum mehr Glück.