Logging-Frameworks wie log4net und NLog sind äußerst bekannt und zahlreich eingesetzt. Mit Serilog steht eine superschnelle Alternative zur Verfügung, die zudem auf das Loggen von strukturierten Daten ausgerichtet ist.

Dieser Beitrag zeigt die Einbindung von Serilog, sowie die Konfiguration über die Konfigurationsdatei appsettings.json. Abschließend werden noch einige Tipps für den Umgang mit Serilog gegeben.

Serilog einbinden

Die Einbindung erfolgt recht einfach. Für den aufgezeigten Anwendungsfall werden folgende NuGet-Pakete benötigt:

  • Serilog.AspNetCore
  • Serilog.Settings.Configuration (Unterstützung für Microsoft.Extensions.Configuration )
  • Serilog.Sinks.File
  • Serilog.Sinks.Console

Die Einbindung erfolgt an einer einzigen Stelle, der Program.cs:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
            .ReadFrom.Configuration(hostingContext.Configuration)
            .Enrich.FromLogContext()
            .WriteTo.Console())
        .UseUrls("http://*:5000")
        .Build();

Damit kann nun über Serilog geloggt werden. Ebenfalls ist es möglich, sich die Schnittstelle ILogger injecten zu lassen. Alle Logger arbeiten mit derselben Implementierung.

Serilog konfigurieren

Nun fehlt noch die Konfiguration in der Datei appsettings.json. Dort werden nun zwei Varianten eingestellt. So wird in eine Datei geschrieben, in unserem Fall gibt es für jeden Tag eine neue Datei. Zusätzlich erfolgt die Ausgabe über die Konsole:

"Serilog": {
    "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
        {
            "Name": "File",
            "Args": { "pathFormat": "logs\\log-{Date}.txt" }
        },
        { "Name": "Console" }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Properties": {
        "Application": "Projektlogger2"
    }
}

Als abschließende Arbeit sind noch alle Logging-Konfigurationen aus der Startup.cs zu entfernen. Dass betrifft sowohl den Aufruf AddLogging() als auch alle Vorkommen und Verwendungen der ILoggerFactory.

Das war es. Ab sofort wird Serilog für die Ausgabe aller Logging-Informationen verwendet.

Konfiguration mit Umgebungsvariablen

Serilog kann über Umgebungsvariablen konfiguriert werden. Hierzu muss dem ConfigurationBuilder mittels AddEnvironmentVariables mitgeteilt werden, dass diese zu berücksichtigen sind. Ist ein Wert bereits über appsettings.json gesetzt, wird dieser durch den Wert der Umgebungsvariable überschrieben:

set Serilog:MinimumLevel=Warning
dotnet run

Ein Blick in die Dokumentation lohnt sich, da es viele Einstellungsmöglichkeiten gibt. Auch die einzelnen Sinks können mitunter darüber konfiguriert werden.

Log-Level überschreiben

Die Konfiguration

"MinimumLevel": "Debug"

setzt ein Log-Level für alle konfigurierten Ausgaben. Hierüber können aber komplexere Angaben gemacht werden:

"MinimumLevel": {
    "Default": "Information",
    "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
    }
}

Das Default-Log-Level wird nun auf Debug gesetzt. Alles für Namespaces beginnend mit Microsoft und System wird auf Error gesetzt.

Performance

Wer sich für eine Performance-Messung interessiert, sei auf den Artikel Serilog vs NLog Benchmarks aus dem August 2017 verwiesen. Wie zahlreichen weiteren Tests zu entnehmen ist, sind beide Frameworks äußerst flott unterwegs und Konkurrenten wie log4net vorzuziehen.

Fazit

Serilog lässt sich genauso einfach in ein Projekt einbinden, wie man es von anderen Logging-Frameworks gewohnt ist. Es bestehen vielfältige Einstellungsmöglichkeiten und jede Menge Adapter (Sinks) für Ausgaben aller Art. Durch die Verwendung von strukturierten Daten ergeben sich zudem zahlreiche Vorteile, wie zum Beispiel das Setzen von Filtern.

Happy Coding!

Über den Autor

Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler und Fotograf. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.