From 2f13a51ac93426515469c3e7213f2d345ef5de1e Mon Sep 17 00:00:00 2001 From: huoshan12345 Date: Tue, 1 Apr 2025 22:48:47 +0800 Subject: [PATCH] using ForEachScopeReversed for IExternalScopeProvider --- .../Logging/SerilogLoggerProvider.cs | 18 ++++++++++-- .../SerilogLoggerTests.cs | 29 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs index 93dce5f..a4c69bd 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs @@ -104,10 +104,10 @@ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) scopeItems?.Reverse(); - _externalScopeProvider?.ForEachScope((state, accumulatingLogEvent) => + _externalScopeProvider?.ForEachScopeReversed((state, accumulatingLogEvent) => { SerilogLoggerScope.EnrichWithStateAndCreateScopeItem( - accumulatingLogEvent, propertyFactory, state, update: true, out var scopeItem); + accumulatingLogEvent, propertyFactory, state, update: false, out var scopeItem); if (scopeItem != null) { @@ -150,3 +150,17 @@ public ValueTask DisposeAsync() } #endif } + +file static class Extensions +{ + public static void ForEachScopeReversed(this IExternalScopeProvider provider, Action callback, TState state) + { + var list = new List<(object?, TState)>(); + provider.ForEachScope((m, n) => list.Add((m, n)), state); + + for (var i = list.Count - 1; i >= 0; i--) + { + callback(list[i].Item1, list[i].Item2); + } + } +} diff --git a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs index 6b27c5d..610e74c 100644 --- a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs +++ b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs @@ -618,4 +618,33 @@ static void AssertHasScalarProperty(LogEvent logEvent, string name, object? expe var scalar = Assert.IsType(result); Assert.Equal(expectedValue, scalar.Value); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void LoggingScopeShouldNotReplacePropertyInLogEvent(bool withExternalScopeProvider) + { + var sink = new CollectingSink(); + using var logger = new LoggerConfiguration().WriteTo.Sink(sink).CreateLogger(); + var serilogLoggerProvider = new SerilogLoggerProvider(logger); + + var services = new ServiceCollection(); + services.AddLogging(l => l.AddSerilog(logger)); + + using var serviceProvider = services.BuildServiceProvider(); + var msLogger = withExternalScopeProvider + ? serviceProvider.GetRequiredService>() + : serilogLoggerProvider.CreateLogger(Name); + + using (msLogger.BeginScope(new Dictionary { { "Value", 1 } })) + using (msLogger.BeginScope(new Dictionary { { "Value", 2 } })) + { + msLogger.LogInformation("Value: {Value}", 3); + } + + var logEvent = sink.Writes.First(); + var value = (logEvent.Properties["Value"] as ScalarValue)?.Value; + + Assert.Equal(3, value); + } }