From 924776ecb498cde2af42ce2f585d90348e493a57 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 2 Jun 2025 18:03:19 +1000 Subject: [PATCH 01/12] Dev version bump [skip ci] --- Directory.Version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Version.props b/Directory.Version.props index 30573e4..68dae2f 100644 --- a/Directory.Version.props +++ b/Directory.Version.props @@ -1,6 +1,6 @@ - 9.0.2 + 9.0.3 From 8fb1e0f8899026e19beccdbddc7bd844ad340f53 Mon Sep 17 00:00:00 2001 From: Andrii Babanin Date: Tue, 3 Jun 2025 16:13:40 +0300 Subject: [PATCH 02/12] Remove closure allocation in SerilogLoggerProvider. --- .../Logging/SerilogLoggerProvider.cs | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs index 93dce5f..695617c 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs @@ -24,6 +24,7 @@ public sealed class SerilogLoggerProvider : ILoggerProvider, ILogEventEnricher, // May be null; if it is, Log.Logger will be lazily used readonly ILogger? _logger; readonly Action? _dispose; + readonly ThreadLocal _scopeCollector = new(() => new ScopeCollector()); #if FEATURE_ASYNCDISPOSABLE readonly Func? _disposeAsync; #endif @@ -90,36 +91,41 @@ public IDisposable BeginScope(T state) /// public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { - List? scopeItems = null; + var scopeCollector = _scopeCollector.Value!; + for (var scope = CurrentScope; scope != null; scope = scope.Parent) { scope.EnrichAndCreateScopeItem(logEvent, propertyFactory, out var scopeItem); if (scopeItem != null) { - scopeItems ??= []; - scopeItems.Add(scopeItem); + scopeCollector.AddItem(scopeItem); } } - scopeItems?.Reverse(); + scopeCollector.ScopeItems?.Reverse(); - _externalScopeProvider?.ForEachScope((state, accumulatingLogEvent) => + _externalScopeProvider?.ForEachScope(static (state, parameters) => { SerilogLoggerScope.EnrichWithStateAndCreateScopeItem( - accumulatingLogEvent, propertyFactory, state, update: true, out var scopeItem); + parameters.LogEvent, + parameters.PropertyFactory, + state, + update: true, + out var scopeItem); if (scopeItem != null) { - scopeItems ??= new List(); - scopeItems.Add(scopeItem); + parameters.ScopeCollector.AddItem(scopeItem); } - }, logEvent); + }, (ScopeCollector: scopeCollector, PropertyFactory: propertyFactory, LogEvent: logEvent)); - if (scopeItems != null) + if (scopeCollector.ScopeItems != null) { - logEvent.AddPropertyIfAbsent(new LogEventProperty(ScopePropertyName, new SequenceValue(scopeItems))); + logEvent.AddPropertyIfAbsent(new LogEventProperty(ScopePropertyName, new SequenceValue(scopeCollector.ScopeItems))); } + + scopeCollector.Clear(); } /// @@ -149,4 +155,20 @@ public ValueTask DisposeAsync() return _disposeAsync?.Invoke() ?? default; } #endif + + /// + /// A wrapper around a list to allow lazy initialization when iterating through scopes. + /// + private sealed class ScopeCollector + { + public List? ScopeItems { get; private set; } + + public void AddItem(LogEventPropertyValue scopeItem) + { + ScopeItems ??= []; + ScopeItems.Add(scopeItem); + } + + public void Clear() => this.ScopeItems = null; + } } From 46dfbf4887dcbb9a07151340e9bbb93e7cf830ce Mon Sep 17 00:00:00 2001 From: Andrii Babanin Date: Wed, 4 Jun 2025 13:50:43 +0300 Subject: [PATCH 03/12] Encapsulate item management logic in ScopeCollector. --- .../Logging/SerilogLoggerProvider.cs | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs index 695617c..2ad7738 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs @@ -103,7 +103,7 @@ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) } } - scopeCollector.ScopeItems?.Reverse(); + scopeCollector.ReverseItems(); _externalScopeProvider?.ForEachScope(static (state, parameters) => { @@ -120,12 +120,10 @@ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) } }, (ScopeCollector: scopeCollector, PropertyFactory: propertyFactory, LogEvent: logEvent)); - if (scopeCollector.ScopeItems != null) + if (scopeCollector.Complete() is { } items) { - logEvent.AddPropertyIfAbsent(new LogEventProperty(ScopePropertyName, new SequenceValue(scopeCollector.ScopeItems))); + logEvent.AddPropertyIfAbsent(new LogEventProperty(ScopePropertyName, new SequenceValue(items))); } - - scopeCollector.Clear(); } /// @@ -159,16 +157,23 @@ public ValueTask DisposeAsync() /// /// A wrapper around a list to allow lazy initialization when iterating through scopes. /// - private sealed class ScopeCollector + sealed class ScopeCollector { - public List? ScopeItems { get; private set; } + List? _scopeItems; public void AddItem(LogEventPropertyValue scopeItem) { - ScopeItems ??= []; - ScopeItems.Add(scopeItem); + _scopeItems ??= []; + _scopeItems.Add(scopeItem); } - public void Clear() => this.ScopeItems = null; + public void ReverseItems() => _scopeItems?.Reverse(); + + public List? Complete() + { + var scopeItems = _scopeItems; + _scopeItems = null; + return scopeItems; + } } } From 61faa663db7920eeeacb374ad35e1d0bc041b232 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 12:52:09 +1000 Subject: [PATCH 04/12] Start implementing a .NET 10 target --- Directory.Version.props | 2 +- global.json | 4 ++-- samples/Sample/Sample.csproj | 6 +++--- .../SampleWithExternalScope.csproj | 6 +++--- .../SampleWithMelProviders.csproj | 4 ++-- .../Serilog.Extensions.Logging.csproj | 13 ++++++++++--- .../Serilog.Extensions.Logging.Benchmarks.csproj | 8 ++++---- .../Serilog.Extensions.Logging.Tests.csproj | 10 +++++----- 8 files changed, 30 insertions(+), 23 deletions(-) diff --git a/Directory.Version.props b/Directory.Version.props index 68dae2f..44918a7 100644 --- a/Directory.Version.props +++ b/Directory.Version.props @@ -1,6 +1,6 @@ - 9.0.3 + 10.0.0 diff --git a/global.json b/global.json index db8627a..516594b 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { "sdk": { - "version": "9.0.100", - "allowPrerelease": false, + "version": "10.0.100-rc.2.25502.107", + "allowPrerelease": true, "rollForward": "latestFeature" } } diff --git a/samples/Sample/Sample.csproj b/samples/Sample/Sample.csproj index 793b13a..d8675b5 100644 --- a/samples/Sample/Sample.csproj +++ b/samples/Sample/Sample.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 Exe @@ -10,8 +10,8 @@ - - + + diff --git a/samples/SampleWithExternalScope/SampleWithExternalScope.csproj b/samples/SampleWithExternalScope/SampleWithExternalScope.csproj index 84cb0ac..5b08a3a 100644 --- a/samples/SampleWithExternalScope/SampleWithExternalScope.csproj +++ b/samples/SampleWithExternalScope/SampleWithExternalScope.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 @@ -10,8 +10,8 @@ - - + + diff --git a/samples/SampleWithMelProviders/SampleWithMelProviders.csproj b/samples/SampleWithMelProviders/SampleWithMelProviders.csproj index 793b13a..d749346 100644 --- a/samples/SampleWithMelProviders/SampleWithMelProviders.csproj +++ b/samples/SampleWithMelProviders/SampleWithMelProviders.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index 3030973..2e4ace0 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -5,7 +5,7 @@ Microsoft;Serilog Contributors - net462;netstandard2.0;netstandard2.1;net8.0;net9.0 + net462;netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0 true serilog;Microsoft.Extensions.Logging serilog-extension-nuget.png @@ -14,7 +14,7 @@ Serilog README.md - NU5118 + NU5118;NU1510 @@ -22,7 +22,10 @@ - + + + + @@ -37,4 +40,8 @@ $(DefineConstants);FEATURE_ITUPLE;FEATURE_ASYNCDISPOSABLE + + + $(DefineConstants);FEATURE_ITUPLE;FEATURE_ASYNCDISPOSABLE + diff --git a/test/Serilog.Extensions.Logging.Benchmarks/Serilog.Extensions.Logging.Benchmarks.csproj b/test/Serilog.Extensions.Logging.Benchmarks/Serilog.Extensions.Logging.Benchmarks.csproj index 34aa874..37568a5 100644 --- a/test/Serilog.Extensions.Logging.Benchmarks/Serilog.Extensions.Logging.Benchmarks.csproj +++ b/test/Serilog.Extensions.Logging.Benchmarks/Serilog.Extensions.Logging.Benchmarks.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0 + net8.0;net9.0;net10.0 false @@ -10,10 +10,10 @@ - + - - + + diff --git a/test/Serilog.Extensions.Logging.Tests/Serilog.Extensions.Logging.Tests.csproj b/test/Serilog.Extensions.Logging.Tests/Serilog.Extensions.Logging.Tests.csproj index aace2e4..1b232e0 100644 --- a/test/Serilog.Extensions.Logging.Tests/Serilog.Extensions.Logging.Tests.csproj +++ b/test/Serilog.Extensions.Logging.Tests/Serilog.Extensions.Logging.Tests.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0;net48 + net8.0;net9.0;net10.0;net48 false @@ -14,11 +14,11 @@ - + - - - + + + From 267c34d01fb2f74bc2a7779ee0c7910fd359a57a Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 12:55:23 +1000 Subject: [PATCH 05/12] Actions update --- .github/workflows/ci.yml | 2 +- serilog-extensions-logging.sln | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index acd3bc6..8b34c29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Setup uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Compute build number shell: bash run: | diff --git a/serilog-extensions-logging.sln b/serilog-extensions-logging.sln index baca24a..dd59b32 100644 --- a/serilog-extensions-logging.sln +++ b/serilog-extensions-logging.sln @@ -32,6 +32,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWithExternalScope", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWithMelProviders", "samples\SampleWithMelProviders\SampleWithMelProviders.csproj", "{B1454759-126F-4F33-84EE-C8E19541DF79}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1990627E-914D-4072-A593-E1FCA2CE110D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{E5A26872-83A7-43A8-8C7D-1C26E56A4FAF}" + ProjectSection(SolutionItems) = preProject + .github\workflows\ci.yml = .github\workflows\ci.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -73,6 +80,7 @@ Global {6D5986FF-EECD-4E75-8BC6-A5F78AB549B2} = {E30F638E-BBBE-4AD1-93CE-48CC69CFEFE1} {653092A8-CBAD-40AA-A4CE-F8B19D6492C2} = {F2407211-6043-439C-8E06-3641634332E7} {B1454759-126F-4F33-84EE-C8E19541DF79} = {F2407211-6043-439C-8E06-3641634332E7} + {E5A26872-83A7-43A8-8C7D-1C26E56A4FAF} = {1990627E-914D-4072-A593-E1FCA2CE110D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {811E61C5-3871-4633-AFAE-B35B619C8A10} From 1d69ff6e97e7ce0bbeac0fbbf1fee1ef84546715 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 12:59:47 +1000 Subject: [PATCH 06/12] Remove unnecessary NoWarn --- .../Serilog.Extensions.Logging.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index 2e4ace0..792076b 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -14,7 +14,7 @@ Serilog README.md - NU5118;NU1510 + NU5118 From e2f18a2e22a2af072d2881eba880aafaa829fbed Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 13:09:35 +1000 Subject: [PATCH 07/12] Work around a .NET 10 RC2 build regression --- .../Serilog.Extensions.Logging.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index 792076b..b6e3804 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -15,6 +15,8 @@ README.md NU5118 + + false From 5d4ab18cbdd2cf97facfc5975da6977ea00db2e8 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 13:20:11 +1000 Subject: [PATCH 08/12] Disable package pruning globally --- Directory.Build.props | 2 ++ .../Serilog.Extensions.Logging.csproj | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index c114992..7df7a25 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -16,6 +16,8 @@ true true snupkg + + false diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index b6e3804..792076b 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -15,8 +15,6 @@ README.md NU5118 - - false From 67ea7336589ac003963d07135516b95ee3e373ca Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 13:39:15 +1000 Subject: [PATCH 09/12] Try getting .NET 4.6.2 test targets to run --- .../Serilog.Extensions.Logging.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index 792076b..f6c71e0 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -29,6 +29,10 @@ + + + + $(DefineConstants);FEATURE_ITUPLE From e4f6e155c5c064f52e7feaee5a13a1a86364e96b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Nov 2025 13:43:59 +1000 Subject: [PATCH 10/12] Remove attempts to work around RC2 build/test regressions, will need to wait for GA --- Directory.Build.props | 2 -- .../Serilog.Extensions.Logging.csproj | 4 ---- 2 files changed, 6 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 7df7a25..c114992 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -16,8 +16,6 @@ true true snupkg - - false diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index f6c71e0..792076b 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -29,10 +29,6 @@ - - - - $(DefineConstants);FEATURE_ITUPLE From 7f7b928bb79bde1ba2a6b3d21ad5b699fc6b8517 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 21 Nov 2025 08:31:51 +1000 Subject: [PATCH 11/12] Update to 10.0.100 --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 516594b..a517500 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.100-rc.2.25502.107", + "version": "10.0.100", "allowPrerelease": true, "rollForward": "latestFeature" } From 2928acf0e3e78a60c96879beb28393abfb5527ea Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 21 Nov 2025 08:32:29 +1000 Subject: [PATCH 12/12] No need for 10-* wildcard --- .../Serilog.Extensions.Logging.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj index 792076b..7e792a5 100644 --- a/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj +++ b/src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj @@ -22,7 +22,7 @@ - +