Skip to content

Commit 294a33d

Browse files
authored
Ignore null loggers returned by LogProviders in ExtendedLoggerFactory (#6585)
1 parent 23c62b8 commit 294a33d

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/Libraries/Microsoft.Extensions.Telemetry/Logging/ExtendedLoggerFactory.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Microsoft.Extensions.Diagnostics.Buffering;
1212
#endif
1313
using Microsoft.Extensions.Diagnostics.Enrichment;
14+
using Microsoft.Extensions.Logging.Abstractions;
1415
using Microsoft.Extensions.Options;
1516
using Microsoft.Shared.Diagnostics;
1617

@@ -223,13 +224,20 @@ private void AddProviderRegistration(ILoggerProvider provider, bool dispose)
223224

224225
private LoggerInformation[] CreateLoggers(string categoryName)
225226
{
226-
var loggers = new LoggerInformation[_providerRegistrations.Count];
227+
var loggers = new List<LoggerInformation>(_providerRegistrations.Count);
227228
for (int i = 0; i < _providerRegistrations.Count; i++)
228229
{
229-
loggers[i] = new LoggerInformation(_providerRegistrations[i].Provider, categoryName);
230+
var loggerInformation = new LoggerInformation(_providerRegistrations[i].Provider, categoryName);
231+
232+
// We do not need to check for NullLogger<T>.Instance as no provider would reasonably return it (the <T> handling is at
233+
// outer loggers level, not inner level loggers in Logger/LoggerProvider).
234+
if (loggerInformation.Logger != NullLogger.Instance)
235+
{
236+
loggers.Add(loggerInformation);
237+
}
230238
}
231239

232-
return loggers;
240+
return loggers.ToArray();
233241
}
234242

235243
private (MessageLogger[] messageLoggers, ScopeLogger[] scopeLoggers) ApplyFilters(LoggerInformation[] loggers)

test/Libraries/Microsoft.Extensions.Telemetry.Tests/Logging/ExtendedLoggerFactoryTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Text;
99
using Microsoft.Extensions.DependencyInjection;
1010
using Microsoft.Extensions.Logging;
11+
using Microsoft.Extensions.Logging.Abstractions;
1112
using Microsoft.Extensions.Logging.Testing;
1213
using Moq;
1314
using Xunit;
@@ -536,6 +537,20 @@ public static void CreateDisposeDisposesInnerServiceProvider()
536537
Assert.True(disposed);
537538
}
538539

540+
[Fact]
541+
public static void NullLoggerByProviderIsIgnored()
542+
{
543+
using var factory = Utils.CreateLoggerFactory(builder =>
544+
{
545+
builder.AddProvider(NullLoggerProvider.Instance);
546+
builder.AddProvider(new Provider());
547+
});
548+
var logger1 = (ExtendedLogger)factory.CreateLogger("C1");
549+
Assert.Single(logger1.MessageLoggers);
550+
551+
logger1.LogInformation("This should not throw an exception.");
552+
}
553+
539554
private class InternalScopeLoggerProvider : ILoggerProvider, ILogger
540555
{
541556
private IExternalScopeProvider _scopeProvider = new LoggerExternalScopeProvider();

0 commit comments

Comments
 (0)