Skip to content

Commit

Permalink
NLogLoggingConfiguration - Fix memory-leak when using AutoReload
Browse files Browse the repository at this point in the history
  • Loading branch information
snakefoot committed Aug 24, 2024
1 parent c2875ea commit c3db743
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public override IEnumerable<string> FileNamesToWatch
{
// Prepare for setting up reload notification handling
_reloadConfiguration = state => ReloadConfigurationSection((IConfigurationSection)state);
LogFactory.ConfigurationChanged -= LogFactory_ConfigurationChanged; // Avoid double registration
LogFactory.ConfigurationChanged += LogFactory_ConfigurationChanged;
}

Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
Expand Down Expand Up @@ -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<NLogLoggingConfiguration> CreateConfiguration(LogFactory logFactory, IEnumerable<KeyValuePair<string, string>> 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<NLogLoggingConfiguration>(nlogConfig);
}

[Fact]
public void ReloadLogFactoryConfigurationKeepVariables()
{
Expand Down

0 comments on commit c3db743

Please sign in to comment.