@@ -13,14 +13,15 @@ namespace Serilog.Extensions.Logging;
13
13
/// An <see cref="ILoggerProvider"/> that pipes events through Serilog.
14
14
/// </summary>
15
15
[ ProviderAlias ( "Serilog" ) ]
16
- public class SerilogLoggerProvider : ILoggerProvider , ILogEventEnricher
16
+ public class SerilogLoggerProvider : ILoggerProvider , ILogEventEnricher , ISupportExternalScope
17
17
{
18
18
internal const string OriginalFormatPropertyName = "{OriginalFormat}" ;
19
19
internal const string ScopePropertyName = "Scope" ;
20
20
21
21
// May be null; if it is, Log.Logger will be lazily used
22
22
readonly ILogger ? _logger ;
23
23
readonly Action ? _dispose ;
24
+ private IExternalScopeProvider ? _externalScopeProvider ;
24
25
25
26
/// <summary>
26
27
/// Construct a <see cref="SerilogLoggerProvider"/>.
@@ -75,13 +76,32 @@ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
75
76
}
76
77
}
77
78
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
+
78
92
if ( scopeItems != null )
79
93
{
80
94
scopeItems . Reverse ( ) ;
81
95
logEvent . AddPropertyIfAbsent ( new LogEventProperty ( ScopePropertyName , new SequenceValue ( scopeItems ) ) ) ;
82
96
}
83
97
}
84
98
99
+ /// <inheritdoc />
100
+ public void SetScopeProvider ( IExternalScopeProvider scopeProvider )
101
+ {
102
+ _externalScopeProvider = scopeProvider ;
103
+ }
104
+
85
105
readonly AsyncLocal < SerilogLoggerScope ? > _value = new ( ) ;
86
106
87
107
internal SerilogLoggerScope ? CurrentScope
0 commit comments