From 7c9831917eb16b56e2465f9deaf29c251fa7fd85 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Wed, 19 Aug 2026 13:06:53 +0200 Subject: [PATCH 1/2] SerilogBestPractices: retarget net10.0, switch to AddSerilog, fix level moniker width - Retarget both projects to net10.0. - builder.Host.UseSerilog(...) -> builder.Services.AddSerilog(...), the form serilog-aspnetcore now documents. The lambda receives an IServiceProvider instead of a HostBuilderContext, so the configuration is re-sourced from builder.Configuration. - appsettings.json output template: {Level:u11} -> {Level:u3}. The width is a maximum, not a field width, so u11 printed every level in full (INFORMATION, WARNING) instead of the conventional aligned INF/WRN/ERR. - Move .MinimumLevel.Information() above the sinks in the bootstrap configuration so it reads configuration-then-destinations. Chain order does not affect behaviour; both are consumed inside CreateLogger(). - Bring packages current: Serilog 4.4.0, Serilog.AspNetCore 10.0.0, Serilog.Settings.Configuration 10.0.1, Serilog.Enrichers.Thread 4.0.0, Serilog.Enrichers.Process 3.0.0, Serilog.Enrichers.Environment 3.0.1, Serilog.Sinks.Console 6.1.1, Serilog.Sinks.Seq 9.1.0, Serilog.Enrichers.ClientInfo 2.9.0, Microsoft.AspNetCore.OpenApi 10.0.11, Microsoft.AspNetCore.Mvc.Testing 10.0.11. - Swashbuckle.AspNetCore 6.4.0 -> 10.2.3. 6.4.0 throws TypeLoadException from SwaggerGenerator.GetSwagger against Microsoft.OpenApi 2.0.0 on net10.0, and the sample's own catch-all disguises it as a host that never got built. --- .../SerilogBestPractices.Tests.csproj | 4 ++-- .../SerilogBestPractices/Program.cs | 6 ++--- .../SerilogBestPractices.csproj | 23 ++++++++++--------- .../SerilogBestPractices/appsettings.json | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/dotnet-logging/SerilogBestPractices/SerilogBestPractices.Tests/SerilogBestPractices.Tests.csproj b/dotnet-logging/SerilogBestPractices/SerilogBestPractices.Tests/SerilogBestPractices.Tests.csproj index 33c97890a8..e02cc79477 100644 --- a/dotnet-logging/SerilogBestPractices/SerilogBestPractices.Tests/SerilogBestPractices.Tests.csproj +++ b/dotnet-logging/SerilogBestPractices/SerilogBestPractices.Tests/SerilogBestPractices.Tests.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable @@ -12,7 +12,7 @@ - + diff --git a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs index 6409562df4..36c50fd125 100644 --- a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs +++ b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs @@ -3,11 +3,11 @@ using SerilogBestPractices.Models; Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() .WriteTo.File( "logs/log.txt", retainedFileCountLimit: 21, rollingInterval: RollingInterval.Day) - .MinimumLevel.Information() .CreateLogger(); try @@ -17,8 +17,8 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); - builder.Host.UseSerilog((context, config) => - config.ReadFrom.Configuration(context.Configuration) + builder.Services.AddSerilog((services, config) => + config.ReadFrom.Configuration(builder.Configuration) .Enrich.With(new ThreadPriorityEnricher())); var app = builder.Build(); diff --git a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/SerilogBestPractices.csproj b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/SerilogBestPractices.csproj index 77b59e5dd4..859df49d1c 100644 --- a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/SerilogBestPractices.csproj +++ b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/SerilogBestPractices.csproj @@ -1,22 +1,23 @@ - net8.0 + net10.0 enable enable - - - - - - - - - - + + + + + + + + + + + diff --git a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/appsettings.json b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/appsettings.json index 95054ce0ec..b73213ef0e 100644 --- a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/appsettings.json +++ b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/appsettings.json @@ -11,7 +11,7 @@ { "Name": "Console", "Args": { - "OutputTemplate": "[{Timestamp:HH:mm:ss} {Level:u11}] {Message:lj}{NewLine}" + "OutputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}" } }, { From 53dba500c05ed55743beaac3d7693f205d3afc2c Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Wed, 19 Aug 2026 13:09:07 +0200 Subject: [PATCH 2/2] SerilogBestPractices: use CreateBootstrapLogger() for the startup logger The host now replaces the startup logger once appsettings.json is read, which is the two-stage initialization serilog-aspnetcore documents. CreateLogger() left the static Log.Logger pinned to the pre-host configuration. --- .../SerilogBestPractices/SerilogBestPractices/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs index 36c50fd125..927502b365 100644 --- a/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs +++ b/dotnet-logging/SerilogBestPractices/SerilogBestPractices/Program.cs @@ -8,7 +8,7 @@ "logs/log.txt", retainedFileCountLimit: 21, rollingInterval: RollingInterval.Day) - .CreateLogger(); + .CreateBootstrapLogger(); try {