@@ -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