Skip to content

Commit 2f1d97e

Browse files
Enhanced LoggerUtil to include DisposeLoggerFactories for better resource management during shutdown.
1 parent 0533c6e commit 2f1d97e

File tree

10 files changed

+38
-14
lines changed

10 files changed

+38
-14
lines changed

src/ServiceControl.Audit/HostApplicationBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static void AddServiceControlAudit(this IHostApplicationBuilder builder,
3939
RecordStartup(settings, configuration, persistenceConfiguration);
4040

4141
builder.Logging.ClearProviders();
42-
builder.Logging.BuildServiceControlLogging(settings.LoggingSettings.LogLevel);
42+
builder.Logging.ConfigureLogging(settings.LoggingSettings.LogLevel);
4343

4444
var services = builder.Services;
4545
var transportSettings = settings.ToTransportSettings();

src/ServiceControl.Audit/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@
5858
{
5959
// The following log statement is meant to leave a trail in the logs to determine if the process was killed
6060
logger?.LogInformation("Shutdown complete");
61-
NLog.LogManager.Shutdown();
61+
LoggerUtil.DisposeLoggerFactories();
6262
}

src/ServiceControl.Infrastructure/LoggerUtil.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace ServiceControl.Infrastructure
22
{
33
using System;
4+
using System.Collections.Concurrent;
45
using Microsoft.Extensions.DependencyInjection;
56
using Microsoft.Extensions.Logging;
67
using NLog.Extensions.Logging;
@@ -28,8 +29,10 @@ public static bool IsLoggingTo(Loggers logger)
2829
return (logger & ActiveLoggers) == logger;
2930
}
3031

31-
public static void BuildServiceControlLogging(this ILoggingBuilder loggingBuilder, LogLevel level)
32+
public static void ConfigureLogging(this ILoggingBuilder loggingBuilder, LogLevel level)
3233
{
34+
loggingBuilder.SetMinimumLevel(level);
35+
3336
if (IsLoggingTo(Loggers.Test))
3437
{
3538
loggingBuilder.Services.AddSingleton<ILoggerProvider>(new TestContextProvider(level));
@@ -53,20 +56,41 @@ public static void BuildServiceControlLogging(this ILoggingBuilder loggingBuilde
5356
{
5457
loggingBuilder.AddOpenTelemetry(configure => configure.AddOtlpExporter());
5558
}
59+
}
5660

57-
loggingBuilder.SetMinimumLevel(level);
61+
static readonly ConcurrentDictionary<LogLevel, ILoggerFactory> _factories = new();
62+
63+
static ILoggerFactory GetOrCreateLoggerFactory(LogLevel level)
64+
{
65+
if (!_factories.TryGetValue(level, out var factory))
66+
{
67+
factory = LoggerFactory.Create(configure => configure.ConfigureLogging(level));
68+
_factories[level] = factory;
69+
}
70+
71+
return factory;
5872
}
5973

6074
public static ILogger<T> CreateStaticLogger<T>(LogLevel level = LogLevel.Information)
6175
{
62-
var factory = LoggerFactory.Create(configure => configure.BuildServiceControlLogging(level));
76+
var factory = GetOrCreateLoggerFactory(level);
6377
return factory.CreateLogger<T>();
6478
}
6579

6680
public static ILogger CreateStaticLogger(Type type, LogLevel level = LogLevel.Information)
6781
{
68-
var factory = LoggerFactory.Create(configure => configure.BuildServiceControlLogging(level));
82+
var factory = GetOrCreateLoggerFactory(level);
6983
return factory.CreateLogger(type);
7084
}
85+
86+
public static void DisposeLoggerFactories()
87+
{
88+
foreach (var factory in _factories.Values)
89+
{
90+
factory.Dispose();
91+
}
92+
93+
_factories.Clear();
94+
}
7195
}
7296
}

src/ServiceControl.Infrastructure/LoggingConfigurator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static class LoggingConfigurator
1717
public static void ConfigureLogging(LoggingSettings loggingSettings)
1818
{
1919
//used for loggers outside of ServiceControl (i.e. transports and core) to use the logger factory defined here
20-
LogManager.UseFactory(new ExtensionsLoggerFactory(LoggerFactory.Create(configure => configure.BuildServiceControlLogging(loggingSettings.LogLevel))));
20+
LogManager.UseFactory(new ExtensionsLoggerFactory(LoggerFactory.Create(configure => configure.ConfigureLogging(loggingSettings.LogLevel))));
2121

2222
if (!LoggerUtil.IsLoggingTo(Loggers.NLog) || NLog.LogManager.Configuration != null)
2323
{

src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ async Task InitializeServiceControl(ScenarioContext context)
9494
EnvironmentName = Environments.Development
9595
});
9696
hostBuilder.Logging.ClearProviders();
97-
hostBuilder.Logging.BuildServiceControlLogging(LogLevel.Information);
97+
hostBuilder.Logging.ConfigureLogging(LogLevel.Information);
9898

9999
hostBuilder.AddServiceControlMonitoring((criticalErrorContext, cancellationToken) =>
100100
{

src/ServiceControl.Monitoring/HostApplicationBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static void AddServiceControlMonitoring(this IHostApplicationBuilder host
3131
EndpointConfiguration endpointConfiguration)
3232
{
3333
hostBuilder.Services.AddLogging();
34-
hostBuilder.Logging.BuildServiceControlLogging(settings.LoggingSettings.LogLevel);
34+
hostBuilder.Logging.ConfigureLogging(settings.LoggingSettings.LogLevel);
3535

3636
var services = hostBuilder.Services;
3737

src/ServiceControl.Monitoring/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@
4949
finally
5050
{
5151
// The following log statement is meant to leave a trail in the logs to determine if the process was killed
52-
logger.LogInformation("Shutdown complete");
53-
NLog.LogManager.Shutdown();
52+
logger?.LogInformation("Shutdown complete");
53+
LoggerUtil.DisposeLoggerFactories();
5454
}

src/ServiceControl.Persistence.Tests/PersistenceTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public async Task SetUp()
3434
var hostBuilder = Host.CreateApplicationBuilder();
3535

3636
LoggerUtil.ActiveLoggers = Loggers.Test;
37-
hostBuilder.Logging.BuildServiceControlLogging(LogLevel.Information);
37+
hostBuilder.Logging.ConfigureLogging(LogLevel.Information);
3838

3939
await PersistenceTestsContext.Setup(hostBuilder);
4040

src/ServiceControl/HostApplicationBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static void AddServiceControl(this IHostApplicationBuilder hostBuilder, S
4242
}
4343

4444
hostBuilder.Logging.ClearProviders();
45-
hostBuilder.Logging.BuildServiceControlLogging(settings.LoggingSettings.LogLevel);
45+
hostBuilder.Logging.ConfigureLogging(settings.LoggingSettings.LogLevel);
4646

4747
var services = hostBuilder.Services;
4848
var transportSettings = settings.ToTransportSettings();

src/ServiceControl/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@
5858
{
5959
// The following log statement is meant to leave a trail in the logs to determine if the process was killed
6060
logger?.LogInformation("Shutdown complete");
61-
NLog.LogManager.Shutdown();
61+
LoggerUtil.DisposeLoggerFactories();
6262
}

0 commit comments

Comments
 (0)