From 536413bafe0ce0f2435165b968e2e172f1ae6514 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 21 Jul 2026 14:39:32 +0200 Subject: [PATCH] feat(logging): Configure Serilog SQLite sink + UI appsettings.json: - Add Application:LogDirectory configuration - Add Serilog WriteTo.SQLite sink (logs.db in LogDirectory) - Logs table with UTC timestamps Program.cs: - Add Serilog.UI usings - Configure Serilog.UI with SQLite provider - Mount UI at /serilog-ui endpoint Web-based log viewer accessible at: https://localhost:7186/serilog-ui --- DocumentOperator.API/Program.cs | 28 +++++++++++++++++++++++++-- DocumentOperator.API/appsettings.json | 12 ++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/DocumentOperator.API/Program.cs b/DocumentOperator.API/Program.cs index 360703e..cd7b19c 100644 --- a/DocumentOperator.API/Program.cs +++ b/DocumentOperator.API/Program.cs @@ -1,4 +1,7 @@ using Serilog; +using Serilog.Ui.Core.Extensions; +using Serilog.Ui.SqliteDataProvider.Extensions; +using Serilog.Ui.Web.Extensions; using DocumentOperator.Infrastructure.Configuration; using DocumentOperator.Application; using DocumentOperator.Infrastructure; @@ -45,7 +48,23 @@ try builder.Services.AddSwaggerDocumentation(); // ======================================== - // 4. Build App + // 4. Serilog.UI Configuration + // ======================================== + var logDirectory = builder.Configuration.GetValue("Application:LogDirectory") + ?? throw new InvalidOperationException("Application:LogDirectory not found in configuration."); + var sqliteDbPath = Path.Combine(logDirectory, "logs.db"); + + builder.Services.AddSerilogUi(logUIOpt => + { + logUIOpt.UseSqliteServer(dbOpt => + { + dbOpt.WithConnectionString($"Data Source={sqliteDbPath}"); + dbOpt.WithTable("Logs"); + }); + }); + + // ======================================== + // 5. Build App // ======================================== var app = builder.Build(); @@ -67,7 +86,12 @@ try app.UseHttpsRedirection(); // ======================================== - // 6. Endpoints (Controller-based API) + // 6. Serilog.UI Dashboard + // ======================================== + app.UseSerilogUi(); // Accessible at /serilog-ui + + // ======================================== + // 7. Endpoints (Controller-based API) // ======================================== app.MapControllers(); // Maps all [ApiController] controllers diff --git a/DocumentOperator.API/appsettings.json b/DocumentOperator.API/appsettings.json index 2ab9320..d944c0b 100644 --- a/DocumentOperator.API/appsettings.json +++ b/DocumentOperator.API/appsettings.json @@ -7,6 +7,10 @@ }, "AllowedHosts": "*", + "Application": { + "LogDirectory": "E:\\LogFiles\\Digital Data\\DocumentOperator.API" + }, + "Serilog": { "MinimumLevel": { "Default": "Information", @@ -30,6 +34,14 @@ "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}" } + }, + { + "Name": "SQLite", + "Args": { + "sqliteDbPath": "E:\\LogFiles\\Digital Data\\DocumentOperator.API\\logs.db", + "tableName": "Logs", + "storeTimestampInUtc": true + } } ], "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]