Skip to content

Commit d457c4e

Browse files
authored
[dotnet] Fix logging issue when log context level conflicts with logger already captured level (#15057)
1 parent c1bb977 commit d457c4e

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

dotnet/src/webdriver/Internal/Logging/LogContext.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using System;
2121
using System.Collections.Concurrent;
2222
using System.Collections.Generic;
23+
using System.Diagnostics.CodeAnalysis;
2324
using 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
}

dotnet/test/common/Internal/Logging/LogTest.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,27 @@ public class LogTest
2828
private TestLogHandler testLogHandler;
2929
private ILogger logger;
3030

31+
private void ResetGlobalLog()
32+
{
33+
Log.SetLevel(LogEventLevel.Info);
34+
Log.Handlers.Clear().Handlers.Add(new ConsoleLogHandler());
35+
}
36+
3137
[SetUp]
3238
public void SetUp()
3339
{
40+
ResetGlobalLog();
41+
3442
testLogHandler = new TestLogHandler();
3543
logger = Log.GetLogger<LogTest>();
3644
}
3745

46+
[TearDown]
47+
public void TearDown()
48+
{
49+
ResetGlobalLog();
50+
}
51+
3852
[Test]
3953
public void LoggerShouldEmitEvent()
4054
{
@@ -160,6 +174,16 @@ public void ContextShouldChangeLevel()
160174
Assert.That(logger.Level, Is.EqualTo(LogEventLevel.Warn));
161175
}
162176

177+
[Test]
178+
public void ContextShouldEmitMessages()
179+
{
180+
using var context = Log.CreateContext(LogEventLevel.Trace).Handlers.Add(testLogHandler);
181+
182+
logger.Trace("test message");
183+
184+
Assert.That(testLogHandler.Events.Count, Is.EqualTo(1));
185+
}
186+
163187
[Test]
164188
public void ShouldCreateContextWithCustomHandler()
165189
{

0 commit comments

Comments
 (0)