Skip to content
Merged
24 changes: 22 additions & 2 deletions dotnet/src/webdriver/Internal/Logging/LogContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

#nullable enable
Expand All @@ -46,7 +47,7 @@ public LogContext(LogEventLevel level, ILogContext? parentLogContext, Concurrent

_parentLogContext = parentLogContext;

_loggers = loggers;
_loggers = CloneLoggers(loggers, level);

if (handlers is not null)
{
Expand Down Expand Up @@ -98,7 +99,7 @@ public ILogger GetLogger(Type type)

public bool IsEnabled(ILogger logger, LogEventLevel level)
{
return Handlers != null && level >= _level && level >= logger.Level;
return Handlers != null && level >= _level && (_loggers?.TryGetValue(logger.Issuer, out var loggerEntry) != true || level >= loggerEntry?.Level);
}

public void EmitMessage(ILogger logger, LogEventLevel level, string message)
Expand Down Expand Up @@ -155,5 +156,24 @@ public void Dispose()

Log.CurrentContext = _parentLogContext;
}

[return: NotNullIfNotNull(nameof(loggers))]
private static ConcurrentDictionary<Type, ILogger>? CloneLoggers(ConcurrentDictionary<Type, ILogger>? loggers, LogEventLevel minimumLevel)
{
if (loggers is null)
{
return null;
}

var cloned = new Dictionary<Type, ILogger>(loggers.Count);

foreach (KeyValuePair<Type, ILogger> logger in loggers)
{
var clonedLogger = new Logger(logger.Value.Issuer, minimumLevel);
cloned.Add(logger.Key, clonedLogger);
}

return new ConcurrentDictionary<Type, ILogger>(cloned);
}
}
}
24 changes: 24 additions & 0 deletions dotnet/test/common/Internal/Logging/LogTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,27 @@ public class LogTest
private TestLogHandler testLogHandler;
private ILogger logger;

private void ResetGlobalLog()
{
Log.SetLevel(LogEventLevel.Info);
Log.Handlers.Clear().Handlers.Add(new ConsoleLogHandler());
}

[SetUp]
public void SetUp()
{
ResetGlobalLog();

testLogHandler = new TestLogHandler();
logger = Log.GetLogger<LogTest>();
}

[TearDown]
public void TearDown()
{
ResetGlobalLog();
}

[Test]
public void LoggerShouldEmitEvent()
{
Expand Down Expand Up @@ -160,6 +174,16 @@ public void ContextShouldChangeLevel()
Assert.That(logger.Level, Is.EqualTo(LogEventLevel.Warn));
}

[Test]
public void ContextShouldEmitMessages()
{
using var context = Log.CreateContext(LogEventLevel.Trace).Handlers.Add(testLogHandler);

logger.Trace("test message");

Assert.That(testLogHandler.Events.Count, Is.EqualTo(1));
}

[Test]
public void ShouldCreateContextWithCustomHandler()
{
Expand Down
Loading