From 278cd311681fc96000c186c5ca6439c09986990b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20H=C3=BCgel?= Date: Wed, 30 Sep 2026 18:05:34 +0200 Subject: [PATCH 1/5] fix: don't use static Log.Logger --- Applications/AdminApi/src/AdminApi/Program.cs | 18 ++++++--------- Applications/ConsumerApi/src/Program.cs | 22 +++++++++--------- .../src/DatabaseMigrator/Program.cs | 10 +++----- .../src/EventHandlerService/Program.cs | 23 ++++++++----------- .../Housekeeper/src/Housekeeper/Program.cs | 6 ++--- .../src/Job.IdentityDeletion/Program.cs | 21 ++++++++--------- .../SseServer/src/SseServer/Program.cs | 18 ++++++--------- 7 files changed, 50 insertions(+), 68 deletions(-) diff --git a/Applications/AdminApi/src/AdminApi/Program.cs b/Applications/AdminApi/src/AdminApi/Program.cs index c614bd776b..1368db3bd3 100644 --- a/Applications/AdminApi/src/AdminApi/Program.cs +++ b/Applications/AdminApi/src/AdminApi/Program.cs @@ -31,19 +31,19 @@ using InfrastructureConfiguration = Backbone.Modules.Devices.Infrastructure.InfrastructureConfiguration; using LogHelper = Backbone.BuildingBlocks.API.Logging.LogHelper; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { - Log.Information("Creating app..."); + startupLogger.Information("Creating app..."); var app = CreateApp(args); - Log.Information("App created."); + app.Logger.LogInformation("App created."); - Log.Information("Starting app..."); + app.Logger.LogInformation("Starting app..."); app.Run(); @@ -51,13 +51,9 @@ } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } -finally -{ - Log.CloseAndFlush(); -} static WebApplication CreateApp(string[] args) { @@ -80,7 +76,7 @@ static WebApplication CreateApp(string[] args) .WithDefaultDestructurers() .WithDestructurers([new DbUpdateExceptionDestructurer()])) .Enrich.WithSensitiveDataMasking(options => options.AddSensitiveDataMasks()), - writeToProviders: true) + preserveStaticLogger: true, writeToProviders: true) .UseServiceProviderFactory(new AutofacServiceProviderFactory()); ConfigureServices(builder.Services, builder.Configuration, builder.Environment); diff --git a/Applications/ConsumerApi/src/Program.cs b/Applications/ConsumerApi/src/Program.cs index b4671e9ea5..922b39df7c 100644 --- a/Applications/ConsumerApi/src/Program.cs +++ b/Applications/ConsumerApi/src/Program.cs @@ -44,19 +44,19 @@ using InfrastructureConfiguration = Backbone.Modules.Quotas.Infrastructure.InfrastructureConfiguration; using LogHelper = Backbone.BuildingBlocks.API.Logging.LogHelper; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { - Log.Information("Creating app..."); + startupLogger.Information("Creating app..."); var app = CreateApp(args); - Log.Information("App created."); + app.Logger.LogInformation("App created."); - Log.Information("Starting app..."); + app.Logger.LogInformation("Starting app..."); app.Run(); @@ -64,13 +64,9 @@ } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } -finally -{ - Log.CloseAndFlush(); -} static WebApplication CreateApp(string[] args) { @@ -93,7 +89,7 @@ static WebApplication CreateApp(string[] args) .WithDefaultDestructurers() .WithDestructurers([new DbUpdateExceptionDestructurer()])) .Enrich.WithSensitiveDataMasking(options => options.AddSensitiveDataMasks()), - writeToProviders: true) + preserveStaticLogger: true, writeToProviders: true) .UseServiceProviderFactory(new AutofacServiceProviderFactory()); ConfigureServices(builder.Services, builder.Configuration, builder.Environment); @@ -235,11 +231,15 @@ static void LoadConfiguration(WebApplicationBuilder webApplicationBuilder, strin { webApplicationBuilder.Configuration.Sources.Clear(); var env = webApplicationBuilder.Environment; + var additionalConfigurationFile = Environment.GetEnvironmentVariable("BACKBONE_ADDITIONAL_CONFIGURATION_FILE"); webApplicationBuilder.Configuration .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .AddJsonFile("appsettings.override.json", optional: true, reloadOnChange: false); + if (!string.IsNullOrWhiteSpace(additionalConfigurationFile)) + webApplicationBuilder.Configuration.AddJsonFile(additionalConfigurationFile, optional: false, reloadOnChange: false); + webApplicationBuilder.Configuration.AddEnvironmentVariables(); webApplicationBuilder.Configuration.AddCommandLine(strings); } diff --git a/Applications/DatabaseMigrator/src/DatabaseMigrator/Program.cs b/Applications/DatabaseMigrator/src/DatabaseMigrator/Program.cs index a40a0831f7..8ec180ad7a 100644 --- a/Applications/DatabaseMigrator/src/DatabaseMigrator/Program.cs +++ b/Applications/DatabaseMigrator/src/DatabaseMigrator/Program.cs @@ -9,9 +9,9 @@ using Serilog.Exceptions.EntityFrameworkCore.Destructurers; using Serilog.Settings.Configuration; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { @@ -25,13 +25,9 @@ } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } -finally -{ - await Log.CloseAndFlushAsync(); -} static IHostBuilder CreateHostBuilder(string[] args) diff --git a/Applications/EventHandlerService/src/EventHandlerService/Program.cs b/Applications/EventHandlerService/src/EventHandlerService/Program.cs index 58afd0ca25..c59f8c7b70 100644 --- a/Applications/EventHandlerService/src/EventHandlerService/Program.cs +++ b/Applications/EventHandlerService/src/EventHandlerService/Program.cs @@ -21,32 +21,29 @@ using Serilog.Settings.Configuration; using InfrastructureConfiguration = Backbone.Modules.Quotas.Infrastructure.InfrastructureConfiguration; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { - Log.Information("Creating app..."); + startupLogger.Information("Creating app..."); - var app = CreateHostBuilder(args); + var app = CreateHostBuilder(args).Build(); + var logger = app.Services.GetRequiredService>(); - Log.Information("App created."); - Log.Information("Starting app..."); + logger.LogInformation("App created."); + logger.LogInformation("Starting app..."); - await app.Build().RunAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } -finally -{ - await Log.CloseAndFlushAsync(); -} static IHostBuilder CreateHostBuilder(string[] args) @@ -101,7 +98,7 @@ static IHostBuilder CreateHostBuilder(string[] args) .WithDefaultDestructurers() .WithDestructurers([new DbUpdateExceptionDestructurer()])) .Enrich.WithSensitiveDataMasking(options => options.AddSensitiveDataMasks()), - writeToProviders: true + preserveStaticLogger: true, writeToProviders: true ); } diff --git a/Applications/Housekeeper/src/Housekeeper/Program.cs b/Applications/Housekeeper/src/Housekeeper/Program.cs index 259a67467a..08a5564238 100644 --- a/Applications/Housekeeper/src/Housekeeper/Program.cs +++ b/Applications/Housekeeper/src/Housekeeper/Program.cs @@ -20,9 +20,9 @@ using Serilog.Exceptions.EntityFrameworkCore.Destructurers; using Serilog.Settings.Configuration; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); using var host = CreateHostBuilder(args).Build(); @@ -36,7 +36,7 @@ } catch (Exception ex) { - Log.Fatal(ex, "There was an error while executing the housekeeper."); + startupLogger.Fatal(ex, "There was an error while executing the housekeeper."); return 1; } finally diff --git a/Applications/IdentityDeletionJobs/src/Job.IdentityDeletion/Program.cs b/Applications/IdentityDeletionJobs/src/Job.IdentityDeletion/Program.cs index 328e8c5197..4e6b39c73f 100644 --- a/Applications/IdentityDeletionJobs/src/Job.IdentityDeletion/Program.cs +++ b/Applications/IdentityDeletionJobs/src/Job.IdentityDeletion/Program.cs @@ -29,32 +29,29 @@ public class Program public static async Task Main(params string[] args) { - Log.Logger = new LoggerConfiguration() + using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { - Log.Information("Creating app..."); + startupLogger.Information("Creating app..."); - var app = CreateHostBuilder(args); + var app = CreateHostBuilder(args).Build(); + var logger = app.Services.GetRequiredService>(); - Log.Information("App created."); - Log.Information("Starting app..."); + logger.LogInformation("App created."); + logger.LogInformation("Starting app..."); - await app.Build().RunAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } - finally - { - await Log.CloseAndFlushAsync(); - } } public static IHostBuilder CreateHostBuilder(string[] args) diff --git a/Applications/SseServer/src/SseServer/Program.cs b/Applications/SseServer/src/SseServer/Program.cs index 2c1d761e18..50f80b763b 100644 --- a/Applications/SseServer/src/SseServer/Program.cs +++ b/Applications/SseServer/src/SseServer/Program.cs @@ -21,19 +21,19 @@ using Configuration = Backbone.SseServer.Configuration; using LogHelper = Backbone.BuildingBlocks.API.Logging.LogHelper; -Log.Logger = new LoggerConfiguration() +using var startupLogger = new LoggerConfiguration() .WriteTo.Console() - .CreateBootstrapLogger(); + .CreateLogger(); try { - Log.Information("Creating app..."); + startupLogger.Information("Creating app..."); var app = CreateApp(args); - Log.Information("App created."); + app.Logger.LogInformation("App created."); - Log.Information("Starting app..."); + app.Logger.LogInformation("Starting app..."); app.Run(); @@ -41,13 +41,9 @@ } catch (Exception ex) { - Log.Fatal(ex, "Host terminated unexpectedly"); + startupLogger.Fatal(ex, "Host terminated unexpectedly"); return 1; } -finally -{ - Log.CloseAndFlush(); -} static WebApplication CreateApp(string[] args) { @@ -69,7 +65,7 @@ static WebApplication CreateApp(string[] args) .Enrich.WithExceptionDetails(new DestructuringOptionsBuilder() .WithDefaultDestructurers() .WithDestructurers([new DbUpdateExceptionDestructurer()])), - writeToProviders: true + preserveStaticLogger: true, writeToProviders: true ) .UseServiceProviderFactory(new AutofacServiceProviderFactory()); From c73d317c1c82178558623f1ea96ebe27a58a5a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20H=C3=BCgel?= Date: Thu, 1 Oct 2026 08:03:02 +0200 Subject: [PATCH 2/5] feat: add possibility to configure an additional configuration file --- Applications/AdminApi/src/AdminApi/Program.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Applications/AdminApi/src/AdminApi/Program.cs b/Applications/AdminApi/src/AdminApi/Program.cs index 1368db3bd3..c8d2267e97 100644 --- a/Applications/AdminApi/src/AdminApi/Program.cs +++ b/Applications/AdminApi/src/AdminApi/Program.cs @@ -140,11 +140,15 @@ static void LoadConfiguration(WebApplicationBuilder webApplicationBuilder, strin { webApplicationBuilder.Configuration.Sources.Clear(); var env = webApplicationBuilder.Environment; + var additionalConfigurationFile = Environment.GetEnvironmentVariable("BACKBONE_ADDITIONAL_CONFIGURATION_FILE"); webApplicationBuilder.Configuration .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .AddJsonFile("appsettings.override.json", optional: true, reloadOnChange: false); + if (!string.IsNullOrWhiteSpace(additionalConfigurationFile)) + webApplicationBuilder.Configuration.AddJsonFile(additionalConfigurationFile, optional: false, reloadOnChange: false); + webApplicationBuilder.Configuration.AddEnvironmentVariables(); webApplicationBuilder.Configuration.AddCommandLine(strings); } From 5a168de4dccfcf13c6fdc777c0a25fb4c442cfc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20H=C3=BCgel?= Date: Thu, 1 Oct 2026 08:03:58 +0200 Subject: [PATCH 3/5] test: set new env var for additional configuration file in both integration test projects --- .../CustomWebApplicationFactory.cs | 15 +++++---------- .../CustomWebApplicationFactory.cs | 15 +++++---------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Applications/AdminApi/test/AdminApi.Tests.Integration/CustomWebApplicationFactory.cs b/Applications/AdminApi/test/AdminApi.Tests.Integration/CustomWebApplicationFactory.cs index 69ba813749..1ef96cd271 100644 --- a/Applications/AdminApi/test/AdminApi.Tests.Integration/CustomWebApplicationFactory.cs +++ b/Applications/AdminApi/test/AdminApi.Tests.Integration/CustomWebApplicationFactory.cs @@ -1,20 +1,15 @@ using Backbone.Tooling.Extensions; using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; namespace Backbone.AdminApi.Tests.Integration; internal class CustomWebApplicationFactory : WebApplicationFactory { - protected override IHost CreateHost(IHostBuilder builder) + public CustomWebApplicationFactory() { - builder.ConfigureHostConfiguration(config => - { - if (Environment.GetEnvironmentVariable("CI").IsNullOrEmpty()) - config.AddJsonFile("api.appsettings.local.override.json"); - }); - - return base.CreateHost(builder); + if (Environment.GetEnvironmentVariable("CI").IsNullOrEmpty()) + Environment.SetEnvironmentVariable( + "BACKBONE_ADDITIONAL_CONFIGURATION_FILE", + Path.Combine(AppContext.BaseDirectory, "api.appsettings.local.override.json")); } } diff --git a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/CustomWebApplicationFactory.cs b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/CustomWebApplicationFactory.cs index 75569d1733..5b88b04bde 100644 --- a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/CustomWebApplicationFactory.cs +++ b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/CustomWebApplicationFactory.cs @@ -1,20 +1,15 @@ using Backbone.Tooling.Extensions; using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; namespace Backbone.ConsumerApi.Tests.Integration; internal class CustomWebApplicationFactory : WebApplicationFactory { - protected override IHost CreateHost(IHostBuilder builder) + public CustomWebApplicationFactory() { - builder.ConfigureHostConfiguration(config => - { - if (Environment.GetEnvironmentVariable("CI").IsNullOrEmpty()) - config.AddJsonFile("api.appsettings.local.override.json"); - }); - - return base.CreateHost(builder); + if (Environment.GetEnvironmentVariable("CI").IsNullOrEmpty()) + Environment.SetEnvironmentVariable( + "BACKBONE_ADDITIONAL_CONFIGURATION_FILE", + Path.Combine(AppContext.BaseDirectory, "api.appsettings.local.override.json")); } } From f9c59db10ee935cbef4e1e86ab6c8b9d7886a2f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20H=C3=BCgel?= Date: Thu, 1 Oct 2026 08:05:01 +0200 Subject: [PATCH 4/5] test: register CustomWebApplicationFactory in DI container to make it being disposed --- .../test/AdminApi.Tests.Integration/Support/Dependencies.cs | 3 ++- .../test/ConsumerApi.Tests.Integration/Support/Dependencies.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Applications/AdminApi/test/AdminApi.Tests.Integration/Support/Dependencies.cs b/Applications/AdminApi/test/AdminApi.Tests.Integration/Support/Dependencies.cs index f9d6b52d47..47926cd4d9 100644 --- a/Applications/AdminApi/test/AdminApi.Tests.Integration/Support/Dependencies.cs +++ b/Applications/AdminApi/test/AdminApi.Tests.Integration/Support/Dependencies.cs @@ -22,7 +22,8 @@ public static IServiceCollection CreateServices() config.GetSection("AdminApi:Http").Bind(options) ); - services.AddSingleton(new HttpClientFactory(new CustomWebApplicationFactory())); + services.AddSingleton(); + services.AddSingleton(sp => new HttpClientFactory(sp.GetRequiredService())); return services; } diff --git a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/Support/Dependencies.cs b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/Support/Dependencies.cs index cfc12e95e5..9b7d2a337f 100644 --- a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/Support/Dependencies.cs +++ b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/Support/Dependencies.cs @@ -23,7 +23,8 @@ public static IServiceCollection CreateServices() services.ConfigureAndValidate(options => config.GetSection("Http").Bind(options)); - services.AddSingleton(new HttpClientFactory(new CustomWebApplicationFactory())); + services.AddSingleton(); + services.AddSingleton(sp => new HttpClientFactory(sp.GetRequiredService())); // For some reason the DI container is not able to use the internal constructor of the ClientPool. Hence we have to create it manually services.AddScoped(sp => new ClientPool(sp.GetRequiredService(), sp.GetRequiredService>())); From 39bda7ed7e9c0294e8f240f19921be27a869ae68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20H=C3=BCgel?= Date: Thu, 1 Oct 2026 08:19:06 +0200 Subject: [PATCH 5/5] test: add missing configuration to api.appsettings.local.override.json files --- .../api.appsettings.local.override.json | 4 +++- .../api.appsettings.local.override.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Applications/AdminApi/test/AdminApi.Tests.Integration/api.appsettings.local.override.json b/Applications/AdminApi/test/AdminApi.Tests.Integration/api.appsettings.local.override.json index d1772cf28e..9bc79857f5 100644 --- a/Applications/AdminApi/test/AdminApi.Tests.Integration/api.appsettings.local.override.json +++ b/Applications/AdminApi/test/AdminApi.Tests.Integration/api.appsettings.local.override.json @@ -1,7 +1,9 @@ { "Infrastructure": { "EventBus": { - "ConnectionInfo": "localhost" + "RabbitMQ": { + "HostName": "localhost" + } }, "SqlDatabase": { "Provider": "Postgres", diff --git a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/api.appsettings.local.override.json b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/api.appsettings.local.override.json index ac9dd33778..00f9a1f061 100644 --- a/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/api.appsettings.local.override.json +++ b/Applications/ConsumerApi/test/ConsumerApi.Tests.Integration/api.appsettings.local.override.json @@ -2,7 +2,9 @@ "RunMigrations": false, "Infrastructure": { "EventBus": { - "ConnectionInfo": "localhost" + "RabbitMQ": { + "HostName": "localhost" + } } }, "ModuleDefaults": {