diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs index 8ca3281e98e9..07568be84ba4 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs @@ -15,6 +15,7 @@ public class ServerLogScope : IDisposable private readonly ConcurrentDictionary _serverLoggers; private readonly ILogger _scopeLogger; private readonly object _lock; + private bool _disposed; public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable) { @@ -45,11 +46,15 @@ private void ServerFixtureOnServerLogged(LogRecord logRecord) ILogger logger; - // There maybe thready safety issues in logging when creating multiple loggers at the same time - // https://github.com/aspnet/Logging/issues/810 lock (_lock) { + if (_disposed) + { + return; + } + // Create (or get) a logger with the same name as the server logger + // Call in the lock to avoid ODE where LoggerFactory could be disposed by the wrapped disposable logger = _serverLoggers.GetOrAdd(write.LoggerName, loggerName => _loggerFactory.CreateLogger(loggerName)); } @@ -62,7 +67,11 @@ public void Dispose() _scopeLogger.LogInformation("Server log scope stopped."); - _wrappedDisposable?.Dispose(); + lock (_lock) + { + _wrappedDisposable?.Dispose(); + _disposed = true; + } } } } \ No newline at end of file