Logger thread safety?

This commit is contained in:
James Newton-King 2018-04-18 10:13:12 +12:00
parent 1fc4a4916f
commit 0f0b9a73c1
No known key found for this signature in database
GPG Key ID: 0A66B2F456BF5526
1 changed files with 13 additions and 2 deletions

View File

@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
private readonly IDisposable _wrappedDisposable;
private readonly ConcurrentDictionary<string, ILogger> _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<string, ILogger>(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);
}