Skip to content

Commit 4589d2a

Browse files
committed
Provide dispose flag to opt-in to provider disposing logger; fixes #41.
1 parent a824bb4 commit 4589d2a

File tree

4 files changed

+393
-4
lines changed

4 files changed

+393
-4
lines changed

src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerProvider.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,20 @@ class SerilogLoggerProvider : ILoggerProvider, ILogEventEnricher
2121

2222
// May be null; if it is, Log.Logger will be lazily used
2323
readonly ILogger _logger;
24+
readonly Action _dispose;
2425

25-
public SerilogLoggerProvider(ILogger logger = null)
26+
public SerilogLoggerProvider(ILogger logger = null, bool dispose = false)
2627
{
2728
if (logger != null)
2829
_logger = logger.ForContext(new[] { this });
30+
31+
if (dispose)
32+
{
33+
if (logger != null)
34+
_dispose = () => (logger as IDisposable)?.Dispose();
35+
else
36+
_dispose = Log.CloseAndFlush;
37+
}
2938
}
3039

3140
public FrameworkLogger CreateLogger(string name)
@@ -77,6 +86,9 @@ public SerilogLoggerScope CurrentScope
7786
}
7887
#endif
7988

80-
public void Dispose() { }
89+
public void Dispose()
90+
{
91+
_dispose?.Invoke();
92+
}
8193
}
8294
}

src/Serilog.Extensions.Logging/SerilogLoggerFactoryExtensions.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@ public static class SerilogLoggerFactoryExtensions
1717
/// </summary>
1818
/// <param name="factory">The logger factory to configure.</param>
1919
/// <param name="logger">The Serilog logger; if not supplied, the static <see cref="Serilog.Log"/> will be used.</param>
20+
/// <param name="dispose">When true, dispose <paramref name="logger"/> when the framework disposes the provider. If the
21+
/// logger is not specified but <paramref name="dispose"/> is true, the <see cref="Log.CloseAndFlush()"/> method will be
22+
/// called on the static <see cref="Log"/> class instead.</param>
2023
/// <returns>The logger factory.</returns>
2124
public static ILoggerFactory AddSerilog(
2225
this ILoggerFactory factory,
23-
ILogger logger = null)
26+
ILogger logger = null,
27+
bool dispose = false)
2428
{
2529
if (factory == null) throw new ArgumentNullException(nameof(factory));
2630

27-
factory.AddProvider(new SerilogLoggerProvider(logger));
31+
factory.AddProvider(new SerilogLoggerProvider(logger, dispose));
2832

2933
return factory;
3034
}

test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.IO;
1010
using System.Linq;
1111
using Serilog.Debugging;
12+
using Serilog.Framework.Logging.Tests.Support;
1213
using Xunit;
1314

1415
namespace Serilog.Extensions.Logging.Test
@@ -269,6 +270,24 @@ public void CarriesEventIdIfNonzero()
269270
Assert.Equal(42, id.Value);
270271
}
271272

273+
[Fact]
274+
public void WhenDisposeIsFalseProvidedLoggerIsNotDisposed()
275+
{
276+
var logger = new DisposeTrackingLogger();
277+
var provider = new SerilogLoggerProvider(logger, false);
278+
provider.Dispose();
279+
Assert.False(logger.IsDisposed);
280+
}
281+
282+
[Fact]
283+
public void WhenDisposeIsTrueProvidedLoggerIsDisposed()
284+
{
285+
var logger = new DisposeTrackingLogger();
286+
var provider = new SerilogLoggerProvider(logger, true);
287+
provider.Dispose();
288+
Assert.True(logger.IsDisposed);
289+
}
290+
272291
private class FoodScope : IEnumerable<KeyValuePair<string, object>>
273292
{
274293
readonly string _name;

0 commit comments

Comments
 (0)