From a9bea183c1cd9c1613a2896c3dfd7042cf1c99a8 Mon Sep 17 00:00:00 2001 From: Anatolii Grynchuk Date: Sat, 2 May 2026 00:38:32 +0300 Subject: [PATCH] feat: add SerilogRegistrar and ContextualSerilogLogger - IContextualSerilogLogger / ContextualSerilogLogger in Services/Logging (handlers get a ForContext-scoped logger via DI, consistent with ItemTracker) - SerilogRegistrar extension on WebApplicationBuilder (Api) - SerilogRegistrar extension on HostApplicationBuilder (Worker) - Both registrars: set Log.Logger, wire Logging + Host/Services, register ILogger singleton - ServiceCollectionExtensions: register IContextualSerilogLogger<> as transient - Program.cs in both apps simplified to single builder.AddSerilog() call Ref: IT-628 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Directory.Packages.props | 1 + HrynCo.NotificationService.Api/Program.cs | 4 +--- .../SerilogRegistrar.cs | 20 ++++++++++++++++++ ...HrynCo.NotificationService.Services.csproj | 1 + .../Logging/ContextualSerilogLogger.cs | 8 +++++++ .../Logging/IContextualSerilogLogger.cs | 11 ++++++++++ .../ServiceCollectionExtensions.cs | 3 +++ HrynCo.NotificationService.Worker/Program.cs | 4 +--- .../SerilogRegistrar.cs | 21 +++++++++++++++++++ 9 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 HrynCo.NotificationService.Api/SerilogRegistrar.cs create mode 100644 HrynCo.NotificationService.Services/Logging/ContextualSerilogLogger.cs create mode 100644 HrynCo.NotificationService.Services/Logging/IContextualSerilogLogger.cs create mode 100644 HrynCo.NotificationService.Worker/SerilogRegistrar.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 7430824..709c83d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -19,6 +19,7 @@ + diff --git a/HrynCo.NotificationService.Api/Program.cs b/HrynCo.NotificationService.Api/Program.cs index 95b1753..21a7ceb 100644 --- a/HrynCo.NotificationService.Api/Program.cs +++ b/HrynCo.NotificationService.Api/Program.cs @@ -1,12 +1,10 @@ using HrynCo.NotificationService.Api; using HrynCo.NotificationService.DAL.EF; using HrynCo.NotificationService.Services; -using Serilog; var builder = WebApplication.CreateBuilder(args); -builder.Host.UseSerilog((context, lc) => - lc.ReadFrom.Configuration(context.Configuration)); +builder.AddSerilog(); var appSettings = builder.Configuration .GetSection(AppSettings.SectionName) diff --git a/HrynCo.NotificationService.Api/SerilogRegistrar.cs b/HrynCo.NotificationService.Api/SerilogRegistrar.cs new file mode 100644 index 0000000..c00ba45 --- /dev/null +++ b/HrynCo.NotificationService.Api/SerilogRegistrar.cs @@ -0,0 +1,20 @@ +using Serilog; + +namespace HrynCo.NotificationService.Api; + +public static class SerilogRegistrar +{ + public static void AddSerilog(this WebApplicationBuilder builder) + { + var loggerConfiguration = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .Enrich.FromLogContext(); + + Log.Logger = loggerConfiguration.CreateLogger(); + + builder.Logging.AddSerilog(Log.Logger); + builder.Host.UseSerilog(); + + builder.Services.AddSingleton(Log.Logger); + } +} \ No newline at end of file diff --git a/HrynCo.NotificationService.Services/HrynCo.NotificationService.Services.csproj b/HrynCo.NotificationService.Services/HrynCo.NotificationService.Services.csproj index e7cba24..d7539ee 100644 --- a/HrynCo.NotificationService.Services/HrynCo.NotificationService.Services.csproj +++ b/HrynCo.NotificationService.Services/HrynCo.NotificationService.Services.csproj @@ -3,6 +3,7 @@ + diff --git a/HrynCo.NotificationService.Services/Logging/ContextualSerilogLogger.cs b/HrynCo.NotificationService.Services/Logging/ContextualSerilogLogger.cs new file mode 100644 index 0000000..53f43ec --- /dev/null +++ b/HrynCo.NotificationService.Services/Logging/ContextualSerilogLogger.cs @@ -0,0 +1,8 @@ +using Serilog; + +namespace HrynCo.NotificationService.Services.Logging; + +public sealed class ContextualSerilogLogger : IContextualSerilogLogger +{ + public ILogger Logger { get; } = Log.ForContext(); +} \ No newline at end of file diff --git a/HrynCo.NotificationService.Services/Logging/IContextualSerilogLogger.cs b/HrynCo.NotificationService.Services/Logging/IContextualSerilogLogger.cs new file mode 100644 index 0000000..718de10 --- /dev/null +++ b/HrynCo.NotificationService.Services/Logging/IContextualSerilogLogger.cs @@ -0,0 +1,11 @@ +using System.Diagnostics.CodeAnalysis; +using Serilog; + +namespace HrynCo.NotificationService.Services.Logging; + +[SuppressMessage("Major Code Smell", "S2326:Unused type parameters should be removed", + Justification = "Generic parameter used in implementation via ForContext.")] +public interface IContextualSerilogLogger +{ + ILogger Logger { get; } +} \ No newline at end of file diff --git a/HrynCo.NotificationService.Services/ServiceCollectionExtensions.cs b/HrynCo.NotificationService.Services/ServiceCollectionExtensions.cs index a5ec603..f49dfdd 100644 --- a/HrynCo.NotificationService.Services/ServiceCollectionExtensions.cs +++ b/HrynCo.NotificationService.Services/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using HrynCo.NotificationService.Services.Behaviors; +using HrynCo.NotificationService.Services.Logging; using MediatR; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +15,8 @@ public static class ServiceCollectionExtensions cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>)); }); + services.AddTransient(typeof(IContextualSerilogLogger<>), typeof(ContextualSerilogLogger<>)); + return services; } } diff --git a/HrynCo.NotificationService.Worker/Program.cs b/HrynCo.NotificationService.Worker/Program.cs index bebce7a..7b2098e 100644 --- a/HrynCo.NotificationService.Worker/Program.cs +++ b/HrynCo.NotificationService.Worker/Program.cs @@ -1,12 +1,10 @@ using HrynCo.NotificationService.DAL.EF; using HrynCo.NotificationService.Services; using HrynCo.NotificationService.Worker; -using Serilog; var builder = Host.CreateApplicationBuilder(args); -builder.Services.AddSerilog(lc => - lc.ReadFrom.Configuration(builder.Configuration)); +builder.AddSerilog(); var appSettings = builder.Configuration .GetSection(AppSettings.SectionName) diff --git a/HrynCo.NotificationService.Worker/SerilogRegistrar.cs b/HrynCo.NotificationService.Worker/SerilogRegistrar.cs new file mode 100644 index 0000000..68e38f5 --- /dev/null +++ b/HrynCo.NotificationService.Worker/SerilogRegistrar.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.Logging; +using Serilog; + +namespace HrynCo.NotificationService.Worker; + +public static class SerilogRegistrar +{ + public static void AddSerilog(this HostApplicationBuilder builder) + { + var loggerConfiguration = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .Enrich.FromLogContext(); + + Log.Logger = loggerConfiguration.CreateLogger(); + + builder.Logging.AddSerilog(Log.Logger); + builder.Services.AddSerilog(); + + builder.Services.AddSingleton(Log.Logger); + } +} \ No newline at end of file