diff --git a/dotnet/src/webdriver/Internal/Logging/LogContext.cs b/dotnet/src/webdriver/Internal/Logging/LogContext.cs index 7ea38d188f1d7..8d32ce3968dc1 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogContext.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogContext.cs @@ -41,6 +41,7 @@ public LogContext(LogEventLevel level, ILogContext? parentLogContext, Concurrent { throw new ArgumentOutOfRangeException(nameof(truncationLength), "Truncation length must be non-negative."); } + _level = level; _parentLogContext = parentLogContext; _loggers = CloneLoggers(loggers, level); diff --git a/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs b/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs index 6f63d2d2bec58..455ef336576e7 100644 --- a/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs +++ b/dotnet/src/webdriver/Internal/Logging/LogHandlerList.cs @@ -17,45 +17,63 @@ // under the License. // +using System.Collections; + namespace OpenQA.Selenium.Internal.Logging; /// /// Represents a list of log handlers. /// /// -internal sealed class LogHandlerList : List, ILogHandlerList +internal sealed class LogHandlerList : ILogHandlerList { private readonly ILogContext _logContext; + private readonly object _lock = new(); + private volatile ILogHandler[] _handlers; public LogHandlerList(ILogContext logContext) { _logContext = logContext; + _handlers = []; } public LogHandlerList(ILogContext logContext, IEnumerable handlers) - : base(handlers) { _logContext = logContext; + _handlers = [.. handlers]; } - public new ILogContext Add(ILogHandler handler) + public ILogContext Add(ILogHandler handler) { - base.Add(handler); + lock (_lock) + { + _handlers = [.. _handlers, handler]; + } return _logContext; } - public new ILogContext Remove(ILogHandler handler) + public ILogContext Remove(ILogHandler handler) { - base.Remove(handler); + lock (_lock) + { + _handlers = [.. _handlers.Where(h => h != handler)]; + } return _logContext; } - public new ILogContext Clear() + public ILogContext Clear() { - base.Clear(); + lock (_lock) + { + _handlers = []; + } return _logContext; } + + public IEnumerator GetEnumerator() => ((IEnumerable)_handlers).GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _handlers.GetEnumerator(); }