Skip to content

Commit e4872a7

Browse files
authored
NLogLoggerProvider - Implement IAsyncDisposable (#825)
1 parent cdaf28b commit e4872a7

4 files changed

Lines changed: 76 additions & 33 deletions

File tree

appveyor.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ skip_tags: true
55
skip_branch_with_pr: true
66

77
environment:
8+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
9+
DOTNET_CLI_TELEMETRY_OPTOUT: true
10+
DOTNET_NOLOGO: true
811
github_auth_token:
912
secure: WYvd/k1xGCsDS+4iOhjzxA5/e36RjkxnuVOHpBR+eDtZNNjpYydCyNfd1COME9jI
1013
sonar_token:

src/NLog.Extensions.Logging/Logging/NLogLoggerFactory.cs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ namespace NLog.Extensions.Logging
99
/// Creating DI loggers for Microsoft.Extensions.Logging and NLog
1010
/// </summary>
1111
public class NLogLoggerFactory : ILoggerFactory
12+
#if NETSTANDARD2_1_OR_GREATER || NET
13+
, IAsyncDisposable
14+
#endif
1215
{
1316
private readonly ConcurrentDictionary<string, Microsoft.Extensions.Logging.ILogger> _loggers = new ConcurrentDictionary<string, Microsoft.Extensions.Logging.ILogger>(StringComparer.Ordinal);
1417

@@ -51,26 +54,6 @@ public NLogLoggerFactory(NLogLoggerProvider provider)
5154
_provider = provider;
5255
}
5356

54-
/// <summary>
55-
/// Cleanup
56-
/// </summary>
57-
public void Dispose()
58-
{
59-
Dispose(true);
60-
GC.SuppressFinalize(this);
61-
}
62-
63-
/// <summary>
64-
/// Cleanup
65-
/// </summary>
66-
protected virtual void Dispose(bool disposing)
67-
{
68-
if (disposing)
69-
{
70-
_provider.Dispose();
71-
}
72-
}
73-
7457
/// <summary>
7558
/// Creates a new <see cref="Microsoft.Extensions.Logging.ILogger" /> instance.
7659
/// </summary>
@@ -100,5 +83,37 @@ public void AddProvider(ILoggerProvider provider)
10083
{
10184
InternalLogger.Debug("NLogLoggerFactory: AddProvider has been ignored {0}", provider?.GetType());
10285
}
86+
87+
/// <summary>
88+
/// Cleanup
89+
/// </summary>
90+
public void Dispose()
91+
{
92+
Dispose(true);
93+
GC.SuppressFinalize(this);
94+
}
95+
96+
/// <summary>
97+
/// Cleanup
98+
/// </summary>
99+
/// <param name="disposing"></param>
100+
protected virtual void Dispose(bool disposing)
101+
{
102+
if (disposing)
103+
{
104+
_provider.Dispose();
105+
}
106+
}
107+
108+
#if NETSTANDARD2_1_OR_GREATER || NET
109+
/// <summary>
110+
/// Cleanup
111+
/// </summary>
112+
async System.Threading.Tasks.ValueTask IAsyncDisposable.DisposeAsync()
113+
{
114+
await _provider.DisposeAsync();
115+
GC.SuppressFinalize(this);
116+
}
117+
#endif
103118
}
104-
}
119+
}

src/NLog.Extensions.Logging/Logging/NLogLoggerProvider.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ namespace NLog.Extensions.Logging
88
/// </summary>
99
[ProviderAlias("NLog")]
1010
public class NLogLoggerProvider : ILoggerProvider
11+
#if NETSTANDARD2_1_OR_GREATER || NET
12+
, IAsyncDisposable
13+
#endif
1114
{
1215
private readonly NLogBeginScopeParser _beginScopeParser;
1316

@@ -87,6 +90,24 @@ protected virtual void Dispose(bool disposing)
8790
}
8891
}
8992
}
93+
94+
#if NETSTANDARD2_1_OR_GREATER || NET
95+
/// <summary>
96+
/// Cleanup
97+
/// </summary>
98+
public async System.Threading.Tasks.ValueTask DisposeAsync()
99+
{
100+
if (Options.ShutdownOnDispose)
101+
{
102+
await LogFactory.DisposeAsync().ConfigureAwait(false);
103+
}
104+
else
105+
{
106+
await LogFactory.FlushAsync(System.Threading.CancellationToken.None).ConfigureAwait(false);
107+
}
108+
GC.SuppressFinalize(this);
109+
}
110+
#endif
90111
}
91112
}
92113

test/NLog.Extensions.Hosting.Tests/ExtensionMethodTests.cs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,18 @@ public void UseNLog_withConfiguration_WorksWithNLog()
6868
[Fact]
6969
public void AddNLog_withShutdownOnDispose_worksWithNLog()
7070
{
71+
var logFactory = new LogFactory(); // Isolated to avoid disposing global LogManager
7172
var someParam = new NLogProviderOptions { ShutdownOnDispose = true };
72-
var actual = new HostBuilder().ConfigureLogging(l => l.AddNLog(someParam)).Build();
73+
var actual = new HostBuilder().ConfigureLogging(l => l.AddNLog(someParam, svc => logFactory)).Build();
7374
try
7475
{
75-
TestHostingResult(actual, false);
76-
Assert.NotNull(LogManager.Configuration);
76+
TestHostingResult(actual, false, logFactory);
77+
Assert.NotNull(logFactory.Configuration);
7778
}
7879
finally
7980
{
8081
actual.Dispose();
81-
Assert.Null(LogManager.Configuration);
82+
Assert.Null(logFactory.Configuration);
8283
}
8384
}
8485

@@ -89,12 +90,14 @@ public void UseNLog_withAddNLog_worksWithNLog()
8990
TestHostingResult(actual, true);
9091
}
9192

92-
private static void TestHostingResult(IHost host, bool resetConfiguration)
93+
private static void TestHostingResult(IHost host, bool resetConfiguration, LogFactory logFactory = null)
9394
{
95+
logFactory ??= LogManager.LogFactory;
96+
9497
try
9598
{
9699
var nlogTarget = new Targets.MemoryTarget() { Name = "Output" };
97-
NLog.LogManager.Setup().LoadConfiguration(c => c.ForLogger().WriteTo(nlogTarget));
100+
logFactory.Setup().LoadConfiguration(c => c.ForLogger().WriteTo(nlogTarget));
98101

99102
var loggerFactory = host.Services.GetService<ILoggerFactory>();
100103
Assert.NotNull(loggerFactory);
@@ -106,7 +109,7 @@ private static void TestHostingResult(IHost host, bool resetConfiguration)
106109
finally
107110
{
108111
if (resetConfiguration)
109-
LogManager.Configuration = null;
112+
logFactory.Configuration = null;
110113
}
111114
}
112115

@@ -202,21 +205,22 @@ public void IHostApplicationBuilder_UseNLog_withConfiguration_WorksWithNLog()
202205
[Fact]
203206
public void IHostApplicationBuilder_AddNLog_withShutdownOnDispose_worksWithNLog()
204207
{
208+
var logFactory = new LogFactory(); // Isolated to avoid disposing global LogManager
205209
var someParam = new NLogProviderOptions { ShutdownOnDispose = true };
206210

207211
var builder = new HostApplicationBuilder();
208-
builder.Logging.AddNLog(someParam);
212+
builder.Logging.AddNLog(someParam, svc => logFactory);
209213

210214
var actual = builder.Build();
211215
try
212216
{
213-
TestHostingResult(actual, false);
214-
Assert.NotNull(LogManager.Configuration);
217+
TestHostingResult(actual, false, logFactory);
218+
Assert.NotNull(logFactory.Configuration);
215219
}
216220
finally
217221
{
218222
actual.Dispose();
219-
Assert.Null(LogManager.Configuration);
223+
Assert.Null(logFactory.Configuration);
220224
}
221225
}
222226

@@ -299,4 +303,4 @@ public void IHostApplicationBuilder_UseNLog_ShouldLogToNLog()
299303
}
300304
#endif
301305
}
302-
}
306+
}

0 commit comments

Comments
 (0)