13
13
// limitations under the License.
14
14
15
15
using System ;
16
- using Microsoft . Extensions . DependencyInjection ;
17
16
using Microsoft . Extensions . Hosting ;
18
17
using Microsoft . Extensions . Logging ;
19
- using Serilog . Extensions . Hosting ;
20
18
using Serilog . Extensions . Logging ;
21
19
// ReSharper disable MemberCanBePrivate.Global
22
20
@@ -27,20 +25,6 @@ namespace Serilog
27
25
/// </summary>
28
26
public static class SerilogHostBuilderExtensions
29
27
{
30
- // Used internally to pass information through the container. We need to do this because if `logger` is the
31
- // root logger, registering it as a singleton may lead to disposal along with the container by MEDI. This isn't
32
- // always desirable, i.e. we may be handed a logger and `dispose: false`, so wrapping it keeps us in control
33
- // of when the logger is disposed.
34
- class RegisteredLogger
35
- {
36
- public RegisteredLogger ( ILogger logger )
37
- {
38
- Logger = logger ;
39
- }
40
-
41
- public ILogger Logger { get ; }
42
- }
43
-
44
28
/// <summary>
45
29
/// Sets Serilog as the logging provider.
46
30
/// </summary>
@@ -63,33 +47,7 @@ public static IHostBuilder UseSerilog(
63
47
64
48
builder . ConfigureServices ( ( _ , collection ) =>
65
49
{
66
- if ( providers != null )
67
- {
68
- collection . AddSingleton < ILoggerFactory > ( services =>
69
- {
70
- var factory = new SerilogLoggerFactory ( logger , dispose , providers ) ;
71
-
72
- foreach ( var provider in services . GetServices < ILoggerProvider > ( ) )
73
- factory . AddProvider ( provider ) ;
74
-
75
- return factory ;
76
- } ) ;
77
- }
78
- else
79
- {
80
- collection . AddSingleton < ILoggerFactory > ( services => new SerilogLoggerFactory ( logger , dispose ) ) ;
81
- }
82
-
83
- if ( logger != null )
84
- {
85
- // This won't (and shouldn't) take ownership of the logger.
86
- collection . AddSingleton ( logger ) ;
87
-
88
- // Still need to use RegisteredLogger as it is used by ConfigureDiagnosticContext.
89
- collection . AddSingleton ( new RegisteredLogger ( logger ) ) ;
90
- }
91
- bool useRegisteredLogger = logger != null ;
92
- ConfigureDiagnosticContext ( collection , useRegisteredLogger ) ;
50
+ collection . AddSerilog ( logger , dispose , providers ) ;
93
51
} ) ;
94
52
95
53
return builder ;
@@ -148,108 +106,16 @@ public static IHostBuilder UseSerilog(
148
106
if ( builder == null ) throw new ArgumentNullException ( nameof ( builder ) ) ;
149
107
if ( configureLogger == null ) throw new ArgumentNullException ( nameof ( configureLogger ) ) ;
150
108
151
- // This check is eager; replacing the bootstrap logger after calling this method is not supported.
152
- #if ! NO_RELOADABLE_LOGGER
153
- var reloadable = Log . Logger as ReloadableLogger ;
154
- var useReload = reloadable != null && ! preserveStaticLogger ;
155
- #else
156
- const bool useReload = false ;
157
- #endif
158
-
159
109
builder . ConfigureServices ( ( context , collection ) =>
160
110
{
161
- LoggerProviderCollection loggerProviders = null ;
162
- if ( writeToProviders )
163
- {
164
- loggerProviders = new LoggerProviderCollection ( ) ;
165
- }
166
-
167
- collection . AddSingleton ( services =>
168
- {
169
- ILogger logger ;
170
- #if ! NO_RELOADABLE_LOGGER
171
- if ( useReload )
172
- {
173
- reloadable ! . Reload ( cfg =>
174
- {
175
- if ( loggerProviders != null )
176
- cfg . WriteTo . Providers ( loggerProviders ) ;
177
-
178
- configureLogger ( context , services , cfg ) ;
179
- return cfg ;
180
- } ) ;
181
-
182
- logger = reloadable . Freeze ( ) ;
183
- }
184
- else
185
- #endif
186
- {
187
- var loggerConfiguration = new LoggerConfiguration ( ) ;
188
-
189
- if ( loggerProviders != null )
190
- loggerConfiguration . WriteTo . Providers ( loggerProviders ) ;
191
-
192
- configureLogger ( context , services , loggerConfiguration ) ;
193
- logger = loggerConfiguration . CreateLogger ( ) ;
194
- }
195
-
196
- return new RegisteredLogger ( logger ) ;
197
- } ) ;
198
-
199
- collection . AddSingleton ( services =>
200
- {
201
- // How can we register the logger, here, but not have MEDI dispose it?
202
- // Using the `NullEnricher` hack to prevent disposal.
203
- var logger = services . GetRequiredService < RegisteredLogger > ( ) . Logger ;
204
- return logger . ForContext ( new NullEnricher ( ) ) ;
205
- } ) ;
206
-
207
- collection . AddSingleton < ILoggerFactory > ( services =>
208
- {
209
- var logger = services . GetRequiredService < RegisteredLogger > ( ) . Logger ;
210
-
211
- ILogger registeredLogger = null ;
212
- if ( preserveStaticLogger )
213
- {
214
- registeredLogger = logger ;
215
- }
216
- else
217
- {
218
- // Passing a `null` logger to `SerilogLoggerFactory` results in disposal via
219
- // `Log.CloseAndFlush()`, which additionally replaces the static logger with a no-op.
220
- Log . Logger = logger ;
221
- }
222
-
223
- var factory = new SerilogLoggerFactory ( registeredLogger , ! useReload , loggerProviders ) ;
224
-
225
- if ( writeToProviders )
226
- {
227
- foreach ( var provider in services . GetServices < ILoggerProvider > ( ) )
228
- factory . AddProvider ( provider ) ;
229
- }
230
-
231
- return factory ;
232
- } ) ;
233
-
234
- ConfigureDiagnosticContext ( collection , preserveStaticLogger ) ;
111
+ collection . AddSerilog (
112
+ ( services , loggerConfiguration ) =>
113
+ configureLogger ( context , services , loggerConfiguration ) ,
114
+ preserveStaticLogger : preserveStaticLogger ,
115
+ writeToProviders : writeToProviders ) ;
235
116
} ) ;
236
117
237
118
return builder ;
238
119
}
239
-
240
- static void ConfigureDiagnosticContext ( IServiceCollection collection , bool useRegisteredLogger )
241
- {
242
- if ( collection == null ) throw new ArgumentNullException ( nameof ( collection ) ) ;
243
-
244
- // Registered to provide two services...
245
- // Consumed by e.g. middleware
246
- collection . AddSingleton ( services =>
247
- {
248
- ILogger logger = useRegisteredLogger ? services . GetRequiredService < RegisteredLogger > ( ) . Logger : null ;
249
- return new DiagnosticContext ( logger ) ;
250
- } ) ;
251
- // Consumed by user code
252
- collection . AddSingleton < IDiagnosticContext > ( services => services . GetRequiredService < DiagnosticContext > ( ) ) ;
253
- }
254
120
}
255
121
}
0 commit comments