2020using System ;
2121using System . Collections . Concurrent ;
2222using System . Collections . Generic ;
23+ using System . Diagnostics . CodeAnalysis ;
2324using System . Linq ;
2425
2526#nullable enable
@@ -30,7 +31,7 @@ namespace OpenQA.Selenium.Internal.Logging
3031 /// Represents a logging context that provides methods for creating sub-contexts, retrieving loggers, emitting log messages, and configuring minimum log levels.
3132 /// </summary>
3233 /// <inheritdoc cref="ILogContext"/>
33- internal class LogContext : ILogContext
34+ internal sealed class LogContext : ILogContext
3435 {
3536 private ConcurrentDictionary < Type , ILogger > ? _loggers ;
3637
@@ -46,7 +47,7 @@ public LogContext(LogEventLevel level, ILogContext? parentLogContext, Concurrent
4647
4748 _parentLogContext = parentLogContext ;
4849
49- _loggers = loggers ;
50+ _loggers = CloneLoggers ( loggers , level ) ;
5051
5152 if ( handlers is not null )
5253 {
@@ -65,12 +66,7 @@ public ILogContext CreateContext()
6566
6667 public ILogContext CreateContext ( LogEventLevel minimumLevel )
6768 {
68- ConcurrentDictionary < Type , ILogger > ? loggers = null ;
69-
70- if ( _loggers != null )
71- {
72- loggers = new ConcurrentDictionary < Type , ILogger > ( _loggers . Select ( l => new KeyValuePair < Type , ILogger > ( l . Key , new Logger ( l . Value . Issuer , minimumLevel ) ) ) ) ;
73- }
69+ ConcurrentDictionary < Type , ILogger > ? loggers = CloneLoggers ( _loggers , minimumLevel ) ;
7470
7571 var context = new LogContext ( minimumLevel , this , loggers , Handlers ) ;
7672
@@ -98,7 +94,7 @@ public ILogger GetLogger(Type type)
9894
9995 public bool IsEnabled ( ILogger logger , LogEventLevel level )
10096 {
101- return Handlers != null && level >= _level && level >= logger . Level ;
97+ return Handlers != null && level >= _level && ( _loggers ? . TryGetValue ( logger . Issuer , out var loggerEntry ) != true || level >= loggerEntry ? . Level ) ;
10298 }
10399
104100 public void EmitMessage ( ILogger logger , LogEventLevel level , string message )
@@ -155,5 +151,24 @@ public void Dispose()
155151
156152 Log . CurrentContext = _parentLogContext ;
157153 }
154+
155+ [ return : NotNullIfNotNull ( nameof ( loggers ) ) ]
156+ private static ConcurrentDictionary < Type , ILogger > ? CloneLoggers ( ConcurrentDictionary < Type , ILogger > ? loggers , LogEventLevel minimumLevel )
157+ {
158+ if ( loggers is null )
159+ {
160+ return null ;
161+ }
162+
163+ var cloned = new Dictionary < Type , ILogger > ( loggers . Count ) ;
164+
165+ foreach ( KeyValuePair < Type , ILogger > logger in loggers )
166+ {
167+ var clonedLogger = new Logger ( logger . Value . Issuer , minimumLevel ) ;
168+ cloned . Add ( logger . Key , clonedLogger ) ;
169+ }
170+
171+ return new ConcurrentDictionary < Type , ILogger > ( cloned ) ;
172+ }
158173 }
159174}
0 commit comments