Serilog in der Konsolen Applikation
Ich zeige in diesem Tutorial wie man Serilog in einer .NET Core Konsolen Applikation verwendet. Als Basis dient dafür mein zuvor veröffentlichtes Tutorial zu Serilog in einer ASP.NET Core Applikation. Alle nötigen Änderungen und wichtige Informationen zusammengefasst.
Serilog in der Konsolen Applikation
Serilog ist eines der besten Logging Interfaces für die Software Entwicklung in C#. Ich habe bereits gezeigt wie einfach man Serilog einsetzt und konfiguriert, damit die Meldungen in einer PostgreSQL Datenbank gespeichert werden. Diese Open Source Datenbank dient auch in diesem Tutorial als primäre Quelle, kann aber jederzeit auch durch eine MySQL, MSSQL oder ähnliche Datenbank ersetzt werden.
Aufgabenstellung
Zusätzlich zum Logging in eine Tabelle in der Datenbank soll für mein Backend zur einfacheren Entwicklung der Log auch auf der Konsole ausgegeben werden. Serilog unterstützt die parallele Verwendung mehrerer Log-Ziele. Neben der Datenbank und der Konsole können das auch Dateien (z.B. unterschiedliche Dateien pro Log-Level) oder auch die Cloud sein (z.B. Application Insights).
NuGet Pakete
Für die Konsolen Applikation verwende ich folgende Pakete, diese hatte ich bereits bei der ASP.NET Applikation verwendet:
- Serilog.Settings.Configuration
- Serilog.Sinks.PostgreSQL
- Serilog.Sinks.PostgreSQL.Configuration
- HaemmerElectronics.SeppPenner.SerilogSinkForPostgreSQL
zusätzlich benötigt man für die Konsole als Ziel:
- Serilog.Sinks.Console
Implementierung
Die Konfiguration von Serilog habe ich in eine JSON Datei ausgelagert. Die ersten Schritte im Main sind deshalb das Auslesen der Konfigurationsdatei in eine Configuration Klasse und danach das Erzeugen eines Loggers basierend auf den dort hinterlegten Einstellungen. Das geht wie folgt:
Interessant ist die Anlage des Loggers der mit ReadFrom.Configuration(configuration) die Informationen aus dem JSON verarbeitet. Die darunter angelegte Logausgabe mit logger.Information(„…“) schreibt die Information bereits im konfigurierten Format auf das konfigurierte Ziel (bzw. Ziele).
Konfiguration
Ich verwende folgende Konfiguration um in eine PostgreSQL Datenbank und auf die Konsole zu loggen:
"Serilog": { "Using": [ "Serilog.Sinks.PostgreSQL.Configuration" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Error" } }, "WriteTo": [ { "Name": "PostgreSQL", "Args": { "connectionString": "GameDbConnection", "tableName": "LogServer", "needAutoCreateTable": true, "respectCase": true, "loggerColumnOptions": { "Id": "IdAutoIncrement", "TimeStamp": "Timestamp", "Message": "Message", "Level": "LevelAsText", "RenderedMessage": "RenderedMessage", "Exception": "Exception", "Properties": "Properties" } } }, { "Name": "Console" } ], },
Was wird dort gemacht? Zuerst wird definiert, dass die Konfiguration mit Unterstützung vom NuGet Package Serilog.Sinks.PostgreSQL.Configuration erfolgt. Danach wird das Loglevel definiert. Ich logge alles ab dem Level Information. Da mit dieser Einstellung für jede Aktion zig Logmeldungen geschrieben werden (die kommen von .NET Core) schließe ich die von Microsoft aus, sofern diese nicht den Status Error haben. Damit schreibe ich fast ausschließlich nur eigene Logmeldungen.
Im WriteTo wird das Ziel der Logs definiert. Es ist möglich dort beliebig viele Ziele zu definieren. Mit Console habe ich die Debugkonsole vom Programm bereits ausreichend definiert. Zusätzlich erstelle ich mit PostgreSQL ein Ziel in einer Open Source Datenbank. Wichtig sind dort der connectionString und tableName. Der connectionString ist entweder die komplette Angabe zu Pfad, Port, Datenbankname, User und Passwort der Datenbank oder der Name eines im appsettings.json zuvor angegebenen connectionStrings. Sofern der Tabellenname auch Großbuchstaben verwendet muss das respectCase Flag gesetzt werden. Mit needAutoCreateTable definiert man, dass die Tabelle automatisch erzeugt wird. Das Format (die Spalten der Tabelle) wird mit loggerColumnOptions definiert.
Fazit
Serilog lässt sich flexibel für unterschiedliche Ziele konfigurieren und funktioniert auch mit nur wenigen Zeilen Code in einer .NET Core Konsolenanwendung.