Serilog mit .NET Core auf PostgreSQL Datenbank
15In diesem Tutorial zeige ich wie man Serilog mit .NET Core auf PostgreSQL Datenbank realisiert. Dank verfügbarer NuGet Packages ist das Setup recht einfach, man bekommt dank Serilog ein recht mächtiges Werkzeug um genau zu sehen was in der Applikation passiert.
Serilog mit .NET Core auf PostgreSQL Datenbank
Serilog ist ein Logging Interface, dass man unter anderem auch im .NET Core Umfeld nutzen kann. Es ist flexibel einsetzbar und erlaubt das Loggen auf unterschiedlichste Ziele. Ich nutze Serilog mit einer PostgreSQL Datenbank. Das Setup ist denkbar einfach. Ich gehe davon aus, dass man bereits an einem .NET Core Projekt arbeitet und eine PostgreSQL Datenbank aufgesetzt hat. Infos zu PostgreSQL Datenbanken und .NET Core findest du in einem anderen Artikel von mir.
NuGet Pakete
Bevor du loslegst musst du folgende NuGet Pakete für die zu loggende App installieren:
- Serilog.AspNetCore
- Serilog.Settings.Configuration
- Serilog.Sinks.PostgreSQL
- Serilog.Sinks.PostgreSQL.Configuration
- HaemmerElectronics.SeppPenner.SerilogSinkForPostgreSQL
Code Änderungen
Die erste Änderung betrifft die Program.cs Datei. Dem HostBuilder muss man mit UseSerilog() die Verwendung vom Serilog als Logger bekannt geben. Das funktioniert wie folgt:
In der Startup.cs Datei wird der Logger konfiguriert und als Singleton für die Dependency Injection vorbereitet. In meinem Fall bezieht der Logger die Konfiguration über die JSON Konfigurationsdatei appsettings.json:
In der Dokumentation findet man Informationen wie man den Logger direkt ohne JSON Datei konfiguriert.
Konfiguration
Die Konfiguration kann ausschließlich im JSON Format erfolgen. Ich verwende für meine App bereits eine PostgreSQL Datenbank, folglich kann ich für Serilog diese DB ebenfalls verwenden und sogar die nötige Log Tabelle über die Konfiguration automatisch erstellen lassen.
Meine Konfiguration im Detail:
"Serilog": { "Using": [ "Serilog.Sinks.PostgreSQL.Configuration" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Error" } }, "Enrich": [ "WithMachineName" ], "WriteTo": [ { "Name": "PostgreSQL", "Args": { "connectionString": "GameDbConnection", "tableName": "LogClient", "needAutoCreateTable": true, "respectCase": true, "loggerColumnOptions": { "Id": "IdAutoIncrement", "TimeStamp": "Timestamp", "Message": "Message", "Level": "LevelAsText", "RenderedMessage": "RenderedMessage", "Exception": "Exception", "Properties": "Properties" } } } ] },
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. In meinem Fall eine PostgreSQL Datenbank. Bei connectionString wird entweder der Connection String vollständig angegeben oder der Name des Connection Strings in der appsettings.json Datei. Mit lableName gibt man der zu erstellenden Tabelle einen Namen. Das Flag respectCase benötigt man, falls der Tabellenname nicht nur Kleinbuchstaben verwendet und das Flag needAutoCreateTable definiert ob die Tabelle beim Start der App erstellt wird. Zuletzt wird im loggerColumnOptions noch angegeben, welche Spalten erstellt werden sollen.
Test
Verwenden kann man den Logger nun in jeder Klasse. Dazu wird das Interface per Dependency Injection instanziert:
Schreiben kann man nun an beliebiger Stelle Logs mit beliebigem Log-Level. Eine Information oder Fehler wird wie folgt hinzugefügt:
In der Datenbank findet man sofort nach Ausführung in der korrekten Tabelle die Log-Nachricht:
Fazit
Ich habe gezeigt wie man in einer ASP.NET Core Applikation Serilog als Logger Interface mit einer PostgreSQL Datenbank verwendet. Der Ansatz ist komplett data driven, das heißt bis auf die Konfigurationsdatei sind keine weiteren Einstellungen zu treffen. Die Tabelle wird automatisch im korrekten Format erstellt, sofern sie nicht existiert. Im nächsten Artikel zeige ich wie man Serilog in einer Konsolenapplikation einrichtet.