Logger thread safety?
This commit is contained in:
parent
1fc4a4916f
commit
0f0b9a73c1
|
|
@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
private readonly IDisposable _wrappedDisposable;
|
private readonly IDisposable _wrappedDisposable;
|
||||||
private readonly ConcurrentDictionary<string, ILogger> _serverLoggers;
|
private readonly ConcurrentDictionary<string, ILogger> _serverLoggers;
|
||||||
private readonly ILogger _scopeLogger;
|
private readonly ILogger _scopeLogger;
|
||||||
|
private readonly object _lock;
|
||||||
|
|
||||||
public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable)
|
public ServerLogScope(ServerFixture serverFixture, ILoggerFactory loggerFactory, IDisposable wrappedDisposable)
|
||||||
{
|
{
|
||||||
|
|
@ -21,6 +22,8 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
_serverFixture = serverFixture;
|
_serverFixture = serverFixture;
|
||||||
_wrappedDisposable = wrappedDisposable;
|
_wrappedDisposable = wrappedDisposable;
|
||||||
|
|
||||||
|
_lock = new object();
|
||||||
|
|
||||||
_serverLoggers = new ConcurrentDictionary<string, ILogger>(StringComparer.Ordinal);
|
_serverLoggers = new ConcurrentDictionary<string, ILogger>(StringComparer.Ordinal);
|
||||||
_scopeLogger = _loggerFactory.CreateLogger(nameof(ServerLogScope));
|
_scopeLogger = _loggerFactory.CreateLogger(nameof(ServerLogScope));
|
||||||
|
|
||||||
|
|
@ -40,8 +43,16 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create (or get) a logger with the same name as the server logger
|
ILogger logger;
|
||||||
var logger = _serverLoggers.GetOrAdd(write.LoggerName, loggerName => _loggerFactory.CreateLogger(loggerName));
|
|
||||||
|
// 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);
|
logger.Log(write.LogLevel, write.EventId, write.State, write.Exception, write.Formatter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue