Beschreibung der Protokollierungsbibliotheken / Sudo Null IT News

Fast alle großen Anwendungen müssen alle Aktionen und Fehler des Programms protokollieren, damit Benutzer bei Programmabstürzen die Mängel schnell beheben können.

Die Implementierung eigener Bibliotheken nimmt nicht viel Zeit in Anspruch. Diese Lösungen werden jedoch wenig Funktionalität haben und möglicherweise zu wenig getestet werden. Daher verwenden Entwickler fertige Lösungen zum Verwalten und Aufzeichnen von Protokollen, während das Programm ausgeführt wird.

Der Vorteil der Verwendung solcher Lösungen besteht darin, dass sie vielseitiger sind, weil sollte mit jedem Code funktionieren und in der Lage sein, Datensätze in verschiedenen Formaten zu speichern (vom einfachen Schreiben in die Konsole bis zum Schreiben von Ergebnissen in die Datenbank).

Das zweite Plus ist, dass vorgefertigte Bibliotheken wiederholt von Benutzern (anderen Entwicklern) getestet wurden und weniger Chancen haben, das Programm durch Absturz der Anwendung negativ zu beeinflussen.

Dieser Artikel gibt einen Überblick über die drei beliebtesten Logging-Bibliotheken: Log4Net, SeriLog, NLog.

Log4Net

Open Source: https://github.com/apache/logging-log4net

Lizenz: Apache-2.0-Lizenz

Offiziellen Website:

Dokumentation: log4net/

In dieser Bibliothek können Sie benannte Logger implementieren, d.h. Mit der statischen LogManager-Klasse können Sie Ihre eigene Protokollierungsinstanz nach Klassentyp oder Zeichenfolgenschlüssel abrufen.

Um die Logger-Einstellungen festzulegen, müssen Sie eine Konfigurationsdatei erstellen (eine ausführliche Anleitung zu Konfigurationsdateien auf Verknüpfung).

Beispiel:

Anzeigemuster für Protokollmeldungen können bequem mit zusammengestellt werden Folgende Tabelle.

Sie können der Konfigurationsdatei auch verschiedene Filter hinzufügen. Dazu müssen Sie der Protokollkonfiguration einen ähnlichen Block hinzufügen:

Beispiel:

Andere Filter werden aufgelistet nach Verknüpfung.

Außerdem können zusätzliche Module (Plug-Ins) in den Logger platziert werden, die eine zusätzliche Funktion hinzufügen, z. B. Remote-Logging auf dem Server. Weitere Informationen zu Plugins finden Sie unter Verknüpfung.

Diese Bibliothek (sowie alle folgenden) kann Meldungsebenen von Debug bis Fatal setzen.

SeriLog

Open Source: https://github.com/serilog/serilog

Lizenz: Apache-2.0-Lizenz

Offiziellen Website:

Dokumentation: https://github.com/serilog/serilog/wiki

Diese Bibliothek ist zunächst nicht durch Ändern von Konfigurationsdateien anpassbar. Dies hat folgende Unannehmlichkeiten zur Folge: Sie können die Konfiguration nicht schnell ändern, um detailliertere Informationen aus dem Programm zu erhalten.

Ein Beispiel für die Erstellung eines Loggers:

var log = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File(“log.txt”) .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information) .CreateLogger();

Um die Möglichkeit hinzuzufügen, die Protokollierungseinstellungen durch Ändern der Konfiguration zu verwalten, können Sie das Paket Serilog.Settings.AppSettings (eine ausführliche Anleitung zu Verknüpfung).

Außerdem hat diese Bibliothek eine statische Eigenschaft Logger der Log-Klasse, in der das Logger-Objekt platziert wird.

Beim Schreiben von Protokollen in einen String können Sie Operatoren hinzufügen, die Ihnen helfen, die Werte von Objekten und einfachen Strukturen anzuzeigen.

Beispiel für Nachrichteneingabe:

var input = new { Latitude = 25, Longitude = 134 }; var Zeit = 34; log.Information(“Verarbeitete {@SensorInput} in {TimeMS:000} ms.”, input, time);

Der @-Operator vor SensorInput weist Serilog an, die Struktur des übergebenen Objekts zu speichern. Wenn dieser Operator weggelassen wird, erkennt Serilog einfache Typen wie Zeichenfolgen, Zahlen, Datum und Uhrzeit, Wörterbücher und Aufzählungen; alle anderen Objekte werden mit ToString() in Strings umgewandelt. “Strukturierung” (Objekttyp-Inferenz) kann erzwungen werden, indem der $-Operator anstelle von @ verwendet wird:

var unbekannt = neu[] { 1, 2, 3 } Log.Information(“Received {$Data}”, unknown);

Das Ergebnis wird sein:

“System.Int32[]”

Das :000-Segment nach TimeMS ist eine Zeichenfolge im .NET-Standardformat, die beeinflusst, wie die Eigenschaft angezeigt wird (und nicht, wie sie erfasst wird). Der in Serilog enthaltene standardmäßige Konsolenempfänger zeigt die obige Meldung wie folgt an:

09:14:22 [Information] { Breitengrad: 25, Längengrad: 134 } in 034 ms verarbeitet.

Bei der Konfiguration des Loggers können Sie Regeln für jede Art der Meldungsausgabe festlegen. Sie können beispielsweise den Wert festlegen, um eine Datei in einem bestimmten Zeitraum zu überschreiben:

Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File(“log-.txt”, rollingInterval: RollingInterval.Day) .CreateLogger();

Oder stellen Sie das Ausgabeformat ein:

.WriteTo.File(“log.txt”, outputTemplate: “{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Ausnahme}”)

Es ist auch möglich, sowohl die allgemeine Mindeststufe der Protokollausgabe als auch für jede einzelne Art der Meldungsausgabe festzulegen:

Log.Logger = neue LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File(“log.txt”) .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information) .CreateLogger();

In der Serilog-Bibliothek können Sie Filter für Protokolleinträge hinzufügen.

Beispiel:

Log.Logger = new LoggerConfiguration() .WriteTo.Console() .Filter.ByExclusive(Matching.WithProperty(“Count”, p => p < 10)) .CreateLogger();

Für jeden Datensatz wird die Count-Eigenschaft überprüft, wenn sie die Bedingung erfüllt, wird der Datensatz erstellt.

Serilog unterstützt auch Fälschungen, d.h. Im Hauptobjekt der Protokollklasse können Sie eine andere Möglichkeit zur Anzeige des Protokolls einfügen, in der Sie Ihre eigenen Regeln, Filter und Wrapper (Senke) definieren können.

Beispiel:

Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.Logger(lc => lc .Filter.ByInclusionOnly(…) .WriteTo.File(“log.txt”)) .CreateLogger();

Mit Serilog können Sie die Protokollierungsebene dynamisch ändern, indem Sie die LoggingLevelSwitch-Klasse verwenden:

var levelSwitch = new LoggingLevelSwitch(); levelSwitch.MinimumLevel = LogEventLevel.Warning; var log = new LoggerConfiguration() .MinimumLevel.ControlledBy(levelSwitch) .WriteTo.ColoredConsole() .CreateLogger();

In Zukunft wird es möglich sein, das levelSwitch-Objekt so zu ändern, dass es die gewünschte Ebene anzeigt.

Nlog

Open Source: https://github.com/NLog/NLog

Lizenz: BSD-3-Klausel-Lizenz

Offiziellen Website: https://nlog-project.org/

Dokumentation: https://github.com/nlog/nlog/wiki

Mit dieser Bibliothek können Sie Protokollobjekte auf zwei Arten erstellen: durch Code und durch eine Konfigurationsdatei

Beispiel:

Erfahren Sie mehr über Protokollkonfigurationsdateien von Verknüpfung.

Ein Beispiel für das Erstellen eines Objekts durch Code:

varconfig = new NLog.Config.LoggingConfiguration(); // Ausgabeziel: Datei und Konsole var logfile = new NLog.Targets.FileTarget(“logfile”) { FileName = “file.txt” }; var logconsole = new NLog.Targets.ConsoleTarget(“logconsole”); // Logger-Abgleichsregeln config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole); config.AddRule (LogLevel.Debug, LogLevel.Fatal, Protokolldatei); // Einstellen der Konfiguration NLog.LogManager.Configuration = config;

Erfahren Sie mehr über die Konfiguration im Code von Verknüpfung

Das Nachrichtenausgabeformat kann durch Hinzufügen eines Layout-Elements zum Ziel festgelegt werden:

${longdate}|${level}|${logger }|${message}|${all-event-properties}{exception:format=tostring}

Diese Bibliothek unterstützt die folgenden Strukturformate:

  • CsvLayout

  • JsonLayout

  • XmlLayout

Das Format in der Konfigurationsdatei sieht folgendermaßen aus:

< attribute name="time" layout="${longdate}" />

NLog enthält solche Operatoren zum Bilden von Strings, wie Serilog.

Die Bibliothek enthält einen asynchronen Wrapper, der das Protokollieren mehrerer Threads in einem Protokollierungsobjekt ermöglicht.

Mit NLog können Sie Variablen in einer Konfigurationsdatei erstellen, die in späteren Teilen der Konfiguration verwendet werden können:

Fazit

Die Hauptmerkmale der zuvor aufgeführten Bibliotheken sind nicht zu unterscheiden. Um eine Lösung auszuwählen, müssen Sie sich mit den Fähigkeiten dieser Bibliotheken befassen. Der Autor hat der NLog-Bibliothek den Vorzug gegeben. Diese Bibliothek enthält bereits einen asynchronen Wrapper, mit dem Sie Anwendungen mit mehreren Threads protokollieren können. Der nächste Vorteil war die anfängliche Möglichkeit, die Loggereinstellungen über die Konfigurationsdatei zu ändern. Der letzte Vorteil, warum der Autor die NLog-Bibliothek bevorzugt, ist die Möglichkeit, Variablen in den Logger-Konfigurationsdateien zu erstellen.

Similar Posts

Leave a Reply

Your email address will not be published.