Skip to content

Commit 2395852

Browse files
author
David Obee
committed
Implement ISupportExternalScope in SerilogLoggerProvider
1 parent 3e5c53c commit 2395852

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ namespace Serilog.Extensions.Logging;
1313
/// An <see cref="ILoggerProvider"/> that pipes events through Serilog.
1414
/// </summary>
1515
[ProviderAlias("Serilog")]
16-
public class SerilogLoggerProvider : ILoggerProvider, ILogEventEnricher
16+
public class SerilogLoggerProvider : ILoggerProvider, ILogEventEnricher, ISupportExternalScope
1717
{
1818
internal const string OriginalFormatPropertyName = "{OriginalFormat}";
1919
internal const string ScopePropertyName = "Scope";
2020

2121
// May be null; if it is, Log.Logger will be lazily used
2222
readonly ILogger? _logger;
2323
readonly Action? _dispose;
24+
private IExternalScopeProvider? _externalScopeProvider;
2425

2526
/// <summary>
2627
/// Construct a <see cref="SerilogLoggerProvider"/>.
@@ -75,13 +76,32 @@ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
7576
}
7677
}
7778

79+
_externalScopeProvider?.ForEachScope((state, accumulatingLogEvent) =>
80+
{
81+
var scope = new SerilogLoggerScope(this, state);
82+
83+
scope.EnrichAndCreateScopeItem(accumulatingLogEvent, propertyFactory, out var scopeItem);
84+
85+
if (scopeItem != null)
86+
{
87+
scopeItems ??= new List<LogEventPropertyValue>();
88+
scopeItems.Add(scopeItem);
89+
}
90+
}, logEvent);
91+
7892
if (scopeItems != null)
7993
{
8094
scopeItems.Reverse();
8195
logEvent.AddPropertyIfAbsent(new LogEventProperty(ScopePropertyName, new SequenceValue(scopeItems)));
8296
}
8397
}
8498

99+
/// <inheritdoc />
100+
public void SetScopeProvider(IExternalScopeProvider scopeProvider)
101+
{
102+
_externalScopeProvider = scopeProvider;
103+
}
104+
85105
readonly AsyncLocal<SerilogLoggerScope?> _value = new();
86106

87107
internal SerilogLoggerScope? CurrentScope

0 commit comments

Comments
 (0)