diff --git a/src/Bootstrap/src/AutoConfiguration/BootstrapScanner.cs b/src/Bootstrap/src/AutoConfiguration/BootstrapScanner.cs index a3c471e64d..997a3279fc 100644 --- a/src/Bootstrap/src/AutoConfiguration/BootstrapScanner.cs +++ b/src/Bootstrap/src/AutoConfiguration/BootstrapScanner.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Steeltoe.Common; using Steeltoe.Common.DynamicTypeAccess; @@ -44,6 +45,7 @@ internal sealed partial class BootstrapScanner private readonly AssemblyLoader _loader; private readonly ILoggerFactory _loggerFactory; private readonly ILogger _logger; + private bool _isSerilogLoaded; public BootstrapScanner(HostBuilderWrapper wrapper, IReadOnlySet assemblyNamesToExclude, ILoggerFactory loggerFactory) { @@ -76,7 +78,9 @@ public void ConfigureSteeltoe() WireIfLoaded(WirePlaceholderResolver, SteeltoeAssemblyNames.ConfigurationPlaceholder); WireIfLoaded(WireConnectors, SteeltoeAssemblyNames.Connectors); - if (!WireIfLoaded(WireDynamicSerilog, SteeltoeAssemblyNames.LoggingDynamicSerilog)) + _isSerilogLoaded = WireIfLoaded(WireDynamicSerilog, SteeltoeAssemblyNames.LoggingDynamicSerilog); + + if (!_isSerilogLoaded) { WireIfLoaded(WireDynamicConsole, SteeltoeAssemblyNames.LoggingDynamicConsole); } @@ -244,7 +248,20 @@ private void WireDiscoveryEureka() private void WireAllActuators() { - _wrapper.ConfigureServices(services => services.AddAllActuators()); + if (_isSerilogLoaded) + { + _wrapper.ConfigureServices(services => + { +#pragma warning disable S4792 // Configuring loggers is security-sensitive + services.AddLogging(loggingBuilder => loggingBuilder.AddDynamicSerilog()); +#pragma warning restore S4792 // Configuring loggers is security-sensitive + services.AddAllActuators(); + }); + } + else + { + _wrapper.ConfigureServices(services => services.AddAllActuators()); + } LogActuatorsConfigured(); } @@ -258,7 +275,20 @@ private void WirePrometheus() private void WireDistributedTracingLogProcessor() { - _wrapper.ConfigureServices(services => services.AddTracingLogProcessor()); + if (_isSerilogLoaded) + { + _wrapper.ConfigureServices(services => + { +#pragma warning disable S4792 // Configuring loggers is security-sensitive + services.AddLogging(loggingBuilder => loggingBuilder.AddDynamicSerilog()); +#pragma warning restore S4792 // Configuring loggers is security-sensitive + services.AddTracingLogProcessor(); + }); + } + else + { + _wrapper.ConfigureServices(services => services.AddTracingLogProcessor()); + } LogDistributedTracingConfigured(); } diff --git a/src/Bootstrap/test/AutoConfiguration.Test/HostBuilderExtensionsTest.cs b/src/Bootstrap/test/AutoConfiguration.Test/HostBuilderExtensionsTest.cs index 8dda994220..c60e9eeae5 100644 --- a/src/Bootstrap/test/AutoConfiguration.Test/HostBuilderExtensionsTest.cs +++ b/src/Bootstrap/test/AutoConfiguration.Test/HostBuilderExtensionsTest.cs @@ -164,6 +164,25 @@ public async Task DynamicSerilog_IsAutowired(HostBuilderType hostBuilderType) AssertDynamicSerilogIsAutowired(hostWrapper); } + [Theory] + [InlineData(HostBuilderType.Host)] + [InlineData(HostBuilderType.WebHost)] + [InlineData(HostBuilderType.WebApplication)] + [InlineData(HostBuilderType.HostApplication)] + public async Task DynamicSerilog_WinsOverActuatorFallback(HostBuilderType hostBuilderType) + { + var assembliesToInclude = new HashSet + { + SteeltoeAssemblyNames.LoggingDynamicSerilog, + SteeltoeAssemblyNames.ManagementEndpoint + }; + + await using HostWrapper hostWrapper = + HostWrapperFactory.GetExcluding(SteeltoeAssemblyNames.All.Except(assembliesToInclude).ToHashSet(), hostBuilderType); + + AssertDynamicSerilogIsAutowired(hostWrapper); + } + [Theory] [InlineData(HostBuilderType.Host)] [InlineData(HostBuilderType.WebHost)]