Skip to content

Commit d00860a

Browse files
committed
feat: add option to clear existing logging providers in AddPowertoolsLogger method
1 parent 2d4f5c0 commit d00860a

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

libraries/src/AWS.Lambda.Powertools.Logging/PowertoolsLoggingBuilderExtensions.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ internal static PowertoolsLoggerConfiguration GetCurrentConfiguration()
5656
/// Adds the Powertools logger to the logging builder with default configuration.
5757
/// </summary>
5858
/// <param name="builder">The logging builder to configure.</param>
59+
/// <param name="clearExistingProviders">Opt-in to clear providers for Powertools-only output</param>
5960
/// <returns>The logging builder for further configuration.</returns>
6061
/// <remarks>
6162
/// This method registers the Powertools logger with default settings. The logger will output
@@ -78,8 +79,14 @@ internal static PowertoolsLoggerConfiguration GetCurrentConfiguration()
7879
/// </code>
7980
/// </example>
8081
public static ILoggingBuilder AddPowertoolsLogger(
81-
this ILoggingBuilder builder)
82+
this ILoggingBuilder builder,
83+
bool clearExistingProviders = false)
8284
{
85+
if (clearExistingProviders)
86+
{
87+
builder.ClearProviders();
88+
}
89+
8390
builder.AddConfiguration();
8491

8592
// register standard logging services
@@ -118,6 +125,7 @@ public static ILoggingBuilder AddPowertoolsLogger(
118125
/// </summary>
119126
/// <param name="builder">The logging builder to configure.</param>
120127
/// <param name="configure"></param>
128+
/// <param name="clearExistingProviders">Opt-in to clear providers for Powertools-only output</param>
121129
/// <returns>The logging builder for further configuration.</returns>
122130
/// <remarks>
123131
/// This method registers the Powertools logger with default settings. The logger will output
@@ -162,10 +170,11 @@ public static ILoggingBuilder AddPowertoolsLogger(
162170
/// </example>
163171
public static ILoggingBuilder AddPowertoolsLogger(
164172
this ILoggingBuilder builder,
165-
Action<PowertoolsLoggerConfiguration> configure)
173+
Action<PowertoolsLoggerConfiguration> configure,
174+
bool clearExistingProviders = false)
166175
{
167176
// Add configuration
168-
builder.AddPowertoolsLogger();
177+
builder.AddPowertoolsLogger(clearExistingProviders);
169178

170179
// Create initial configuration
171180
var options = new PowertoolsLoggerConfiguration();
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using System.Linq;
3+
using AWS.Lambda.Powertools.Logging.Internal;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
6+
using Xunit;
7+
8+
namespace AWS.Lambda.Powertools.Logging.Tests;
9+
10+
public class PowertoolsLoggerExtensionsTests
11+
{
12+
[Fact]
13+
public void AddPowertoolsLogger_WithClearExistingProviders_False_KeepsExistingProviders()
14+
{
15+
// Arrange
16+
var serviceCollection = new ServiceCollection();
17+
serviceCollection.AddLogging(builder =>
18+
{
19+
// Add a mock existing provider first
20+
builder.Services.AddSingleton<ILoggerProvider, MockLoggerProvider>();
21+
22+
// Act
23+
builder.AddPowertoolsLogger(clearExistingProviders: false);
24+
});
25+
26+
var serviceProvider = serviceCollection.BuildServiceProvider();
27+
var loggerProviders = serviceProvider.GetServices<ILoggerProvider>();
28+
29+
// Assert
30+
var collection = loggerProviders as ILoggerProvider[] ?? loggerProviders.ToArray();
31+
Assert.Contains(collection, p => p is MockLoggerProvider);
32+
Assert.Contains(collection, p => p is PowertoolsLoggerProvider);
33+
Assert.True(collection.Count() >= 2); // Should have both providers
34+
}
35+
36+
[Fact]
37+
public void AddPowertoolsLogger_WithClearExistingProviders_True_RemovesExistingProviders()
38+
{
39+
// Arrange
40+
var serviceCollection = new ServiceCollection();
41+
serviceCollection.AddLogging(builder =>
42+
{
43+
// Add a mock existing provider first
44+
builder.Services.AddSingleton<ILoggerProvider, MockLoggerProvider>();
45+
46+
// Act
47+
builder.AddPowertoolsLogger(clearExistingProviders: true);
48+
});
49+
50+
var serviceProvider = serviceCollection.BuildServiceProvider();
51+
var loggerProviders = serviceProvider.GetServices<ILoggerProvider>();
52+
53+
// Assert
54+
var collection = loggerProviders as ILoggerProvider[] ?? loggerProviders.ToArray();
55+
Assert.DoesNotContain(collection, p => p is MockLoggerProvider);
56+
Assert.Contains(collection, p => p is PowertoolsLoggerProvider);
57+
Assert.Single(collection); // Should only have Powertools provider
58+
}
59+
60+
private class MockLoggerProvider : ILoggerProvider
61+
{
62+
public ILogger CreateLogger(string categoryName) => new MockLogger();
63+
public void Dispose() { }
64+
}
65+
66+
private class MockLogger : ILogger
67+
{
68+
public IDisposable BeginScope<TState>(TState state) => null;
69+
public bool IsEnabled(LogLevel logLevel) => true;
70+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { }
71+
}
72+
}

0 commit comments

Comments
 (0)