11namespace ServiceControl . Infrastructure
22{
33 using System ;
4+ using System . Collections . Concurrent ;
45 using Microsoft . Extensions . DependencyInjection ;
56 using Microsoft . Extensions . Logging ;
67 using NLog . Extensions . Logging ;
@@ -28,8 +29,10 @@ public static bool IsLoggingTo(Loggers logger)
2829 return ( logger & ActiveLoggers ) == logger ;
2930 }
3031
31- public static void BuildServiceControlLogging ( this ILoggingBuilder loggingBuilder , LogLevel level )
32+ public static void ConfigureLogging ( this ILoggingBuilder loggingBuilder , LogLevel level )
3233 {
34+ loggingBuilder . SetMinimumLevel ( level ) ;
35+
3336 if ( IsLoggingTo ( Loggers . Test ) )
3437 {
3538 loggingBuilder . Services . AddSingleton < ILoggerProvider > ( new TestContextProvider ( level ) ) ;
@@ -53,20 +56,41 @@ public static void BuildServiceControlLogging(this ILoggingBuilder loggingBuilde
5356 {
5457 loggingBuilder . AddOpenTelemetry ( configure => configure . AddOtlpExporter ( ) ) ;
5558 }
59+ }
5660
57- loggingBuilder . SetMinimumLevel ( level ) ;
61+ static readonly ConcurrentDictionary < LogLevel , ILoggerFactory > _factories = new ( ) ;
62+
63+ static ILoggerFactory GetOrCreateLoggerFactory ( LogLevel level )
64+ {
65+ if ( ! _factories . TryGetValue ( level , out var factory ) )
66+ {
67+ factory = LoggerFactory . Create ( configure => configure . ConfigureLogging ( level ) ) ;
68+ _factories [ level ] = factory ;
69+ }
70+
71+ return factory ;
5872 }
5973
6074 public static ILogger < T > CreateStaticLogger < T > ( LogLevel level = LogLevel . Information )
6175 {
62- var factory = LoggerFactory . Create ( configure => configure . BuildServiceControlLogging ( level ) ) ;
76+ var factory = GetOrCreateLoggerFactory ( level ) ;
6377 return factory . CreateLogger < T > ( ) ;
6478 }
6579
6680 public static ILogger CreateStaticLogger ( Type type , LogLevel level = LogLevel . Information )
6781 {
68- var factory = LoggerFactory . Create ( configure => configure . BuildServiceControlLogging ( level ) ) ;
82+ var factory = GetOrCreateLoggerFactory ( level ) ;
6983 return factory . CreateLogger ( type ) ;
7084 }
85+
86+ public static void DisposeLoggerFactories ( )
87+ {
88+ foreach ( var factory in _factories . Values )
89+ {
90+ factory . Dispose ( ) ;
91+ }
92+
93+ _factories . Clear ( ) ;
94+ }
7195 }
7296}
0 commit comments