diff --git a/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs b/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs index eafc2fc8..b6b217cf 100644 --- a/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs +++ b/src/NLog.Extensions.Logging/Config/NLogLoggingConfiguration.cs @@ -59,6 +59,7 @@ public override IEnumerable FileNamesToWatch { // Prepare for setting up reload notification handling _reloadConfiguration = state => ReloadConfigurationSection((IConfigurationSection)state); + LogFactory.ConfigurationChanged -= LogFactory_ConfigurationChanged; // Avoid double registration LogFactory.ConfigurationChanged += LogFactory_ConfigurationChanged; } @@ -102,6 +103,7 @@ private void LogFactory_ConfigurationChanged(object sender, LoggingConfiguration else if (ReferenceEquals(e.ActivatedConfiguration, this) && _autoReload && _reloadConfiguration != null) { // Setup reload notification + LogFactory.ConfigurationChanged -= LogFactory_ConfigurationChanged; // Avoid double registration LogFactory.ConfigurationChanged += LogFactory_ConfigurationChanged; MonitorForReload(_originalConfigSection); } diff --git a/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs b/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs index e651e2e6..51f295a8 100644 --- a/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs +++ b/test/NLog.Extensions.Logging.Tests/NLogLoggingConfigurationTests.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -386,6 +387,30 @@ public void ReloadLogFactoryConfiguration() configuration.Reload(); // Nothing should happen } + [Fact] + public void ReloadLogFactoryConfigurationWithoutLeak() + { + var memoryConfig = CreateMemoryConfigConsoleTargetAndRule(); + memoryConfig["NLog:Targets:file:type"] = "File"; + memoryConfig["NLog:Targets:file:fileName"] = "hello.txt"; + memoryConfig["NLog:AutoReload"] = "true"; + var logFactory = new LogFactory(); + var newConfig = CreateConfiguration(logFactory, memoryConfig); + logFactory.Configuration = null; + GC.Collect(); + Assert.False(newConfig.TryGetTarget(out _)); + } + + static WeakReference CreateConfiguration(LogFactory logFactory, IEnumerable> config) + { + var configuration = new ConfigurationBuilder().AddInMemoryCollection(config).Build(); + var nlogConfig = new NLogLoggingConfiguration(configuration.GetSection("NLog"), logFactory); + logFactory.Configuration = nlogConfig; + configuration.Reload(); + (configuration as IDisposable)?.Dispose(); + return new WeakReference(nlogConfig); + } + [Fact] public void ReloadLogFactoryConfigurationKeepVariables() {