diff --git a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs index 702d43f706..c9e110112e 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests.Utils/ServerLogScope.cs @@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests private readonly IDisposable _wrappedDisposable; private readonly ConcurrentDictionary _serverLoggers; private readonly ILogger _scopeLogger; + private readonly object _lock; public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable) { @@ -21,6 +22,8 @@ namespace Microsoft.AspNetCore.SignalR.Tests _serverFixture = serverFixture; _wrappedDisposable = wrappedDisposable; + _lock = new object(); + _serverLoggers = new ConcurrentDictionary(StringComparer.Ordinal); _scopeLogger = _loggerFactory.CreateLogger(nameof(ServerLogScope)); @@ -40,8 +43,16 @@ namespace Microsoft.AspNetCore.SignalR.Tests return; } - // Create (or get) a logger with the same name as the server logger - var logger = _serverLoggers.GetOrAdd(write.LoggerName, loggerName => _loggerFactory.CreateLogger(loggerName)); + ILogger logger; + + // There maybe thready safety issues in logging when creating multiple threads at the same time + // https://github.com/aspnet/Logging/issues/810 + lock (_lock) + { + // Create (or get) a logger with the same name as the server logger + logger = _serverLoggers.GetOrAdd(write.LoggerName, loggerName => _loggerFactory.CreateLogger(loggerName)); + } + logger.Log(write.LogLevel, write.EventId, write.State, write.Exception, write.Formatter); }