Skip to content

Fix crash when logging providers are cleared after dynamic logging setup#1675

Draft
Copilot wants to merge 4 commits intomainfrom
copilot/fix-logging-providers-error
Draft

Fix crash when logging providers are cleared after dynamic logging setup#1675
Copilot wants to merge 4 commits intomainfrom
copilot/fix-logging-providers-error

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 16, 2026

  • Fix crash when ClearProviders() is called after AddDynamicConsole()/AddDynamicSerilog()
  • Add regression test DoesNotCrashWhenLoggingProvidersAreCleared for DynamicConsole
  • Add regression test DoesNotCrashWhenLoggingProvidersAreCleared for DynamicSerilog
  • Add test CanUseThirdPartyDynamicLoggerProvider to verify IDynamicLoggerProvider extensibility: registers third-party provider as both ILoggerProvider and IDynamicLoggerProvider, asserts it is resolvable through both, and asserts DynamicConsoleLoggerProvider is NOT in IEnumerable<ILoggerProvider>

…AddDynamicSerilog

Register the concrete provider type as a standalone singleton so that IDynamicLoggerProvider
remains resolvable even when ClearProviders() is called after the dynamic logging setup.
Previously, IDynamicLoggerProvider was resolved via a factory that searched through
ILoggerProvider services using .Single(), which threw when ClearProviders() removed them.

Agent-Logs-Url: https://github.com/SteeltoeOSS/Steeltoe/sessions/9b9035c5-5b65-49bc-b0dd-a2e9cdd0fd14

Co-authored-by: bart-vmware <104792814+bart-vmware@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix application crash when removing logging providers Fix crash when logging providers are cleared after dynamic logging setup Apr 16, 2026
Copilot AI requested a review from bart-vmware April 16, 2026 11:21
Comment thread src/Logging/test/DynamicConsole.Test/HostBuilderTest.cs
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, DynamicConsoleLoggerProvider>());
builder.Services.AddSingleton(provider => provider.GetServices<ILoggerProvider>().OfType<IDynamicLoggerProvider>().Single());
builder.Services.TryAddSingleton<DynamicConsoleLoggerProvider>();
builder.Services.AddSingleton<ILoggerProvider>(serviceProvider => serviceProvider.GetRequiredService<DynamicConsoleLoggerProvider>());
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Beware that IDynamicLoggerProvider is a public API extensibility point. This means the feature also needs to work with third-party implementations. Add a test with a fake implementation (as a private nested type) to verify this is still possible.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added CanUseThirdPartyDynamicLoggerProvider in DynamicConsole.Test/HostBuilderTest.cs (commit 7b47671). It registers the existing OtherDynamicLoggerProvider (private nested type) as IDynamicLoggerProvider before calling AddDynamicConsole(), then asserts that GetService<IDynamicLoggerProvider>() resolves to the fake implementation — not DynamicConsoleLoggerProvider. The test passes with both the old and new code, confirming the extensibility point is preserved.

Copy link
Copy Markdown
Member

@bart-vmware bart-vmware Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot My concern is that injecting IEnumerable<ILoggerProvider> returns a DynamicConsoleLoggerProvider instead of the OtherDynamicLoggerProvider. Update the test to verify this.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Take a look at my previous remark.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 9480d4f. The test now registers OtherDynamicLoggerProvider as both ILoggerProvider and IDynamicLoggerProvider (the same pattern Steeltoe uses for its own providers), then asserts:

  • IDynamicLoggerProvider resolves to OtherDynamicLoggerProvider
  • IEnumerable<ILoggerProvider> contains exactly one OtherDynamicLoggerProvider
  • IEnumerable<ILoggerProvider> does NOT contain DynamicConsoleLoggerProvider

Also fixed OtherDynamicLoggerProvider.CreateLogger to return NullLogger.Instance instead of throwing, since the logging infrastructure calls it when the provider is registered as ILoggerProvider.

@sonarqubecloud
Copy link
Copy Markdown

@github-actions
Copy link
Copy Markdown
Contributor

Summary - All Code Coverage (ubuntu-latest)

Line coverage Branch coverage

Assembly Line coverage Branch coverage
Steeltoe.Bootstrap.AutoConfiguration 97.4% 100%
Steeltoe.Common 84.5% 77.8%
Steeltoe.Common.Certificates 97.2% 85.9%
Steeltoe.Common.Hosting 84% 70%
Steeltoe.Common.Http 100% 85.2%
Steeltoe.Common.Logging 81.1% 56.2%
Steeltoe.Common.Net 64.5% 66.6%
Steeltoe.Configuration.Abstractions 96.1% 90.7%
Steeltoe.Configuration.CloudFoundry 99.1% 91.8%
Steeltoe.Configuration.ConfigServer 91.1% 85.9%
Steeltoe.Configuration.Encryption 97.6% 92.4%
Steeltoe.Configuration.Kubernetes.ServiceBindings 95.1% 89.3%
Steeltoe.Configuration.Placeholder 93.8% 84.7%
Steeltoe.Configuration.RandomValue 93.2% 90%
Steeltoe.Configuration.SpringBoot 98.3% 95%
Steeltoe.Connectors 93.9% 89.4%
Steeltoe.Connectors.EntityFrameworkCore 81.5% 75%
Steeltoe.Discovery.Configuration 96.3% 91.6%
Steeltoe.Discovery.Consul 97.6% 96.5%
Steeltoe.Discovery.Eureka 92.2% 85.3%
Steeltoe.Discovery.HttpClients 94.3% 95.4%
Steeltoe.Logging.Abstractions 99.4% 96.9%
Steeltoe.Logging.DynamicConsole 100% 95.4%
Steeltoe.Logging.DynamicSerilog 99.1% 95.4%
Steeltoe.Management.Abstractions 100% 100%
Steeltoe.Management.Endpoint 95.8% 89%
Steeltoe.Management.Prometheus 95.8% 91.6%
Steeltoe.Management.Tasks 100% ****
Steeltoe.Management.Tracing 100% 75%
Steeltoe.Security.Authentication.JwtBearer 100% 100%
Steeltoe.Security.Authentication.OpenIdConnect 73.8% 59%
Steeltoe.Security.Authorization.Certificate 96.7% 75%
Steeltoe.Security.DataProtection.Redis 100% ****

…gerProvider behavior

Agent-Logs-Url: https://github.com/SteeltoeOSS/Steeltoe/sessions/0abdafc7-d2c6-4eea-bb74-cf1283bd7ed7

Co-authored-by: bart-vmware <104792814+bart-vmware@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

removing logging providers crashed application

2 participants