Skip to content

Commit e8a8db6

Browse files
authored
NLogProviderOptions with support for RegisterServiceProvider (#535)
* NLogProviderOptions with support for RegisterServiceProvider * Updated to NLog 5 preview 2 to fix unit-test
1 parent 039f13a commit e8a8db6

8 files changed

Lines changed: 51 additions & 12 deletions

File tree

src/NLog.Extensions.Hosting/Extensions/ConfigureExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,14 @@ private static void AddNLogLoggerProvider(IServiceCollection services, IConfigur
4949
private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serviceProvider, IConfiguration configuration, NLogProviderOptions options)
5050
{
5151
NLogLoggerProvider provider = new NLogLoggerProvider(options);
52+
5253
configuration = SetupConfiguration(serviceProvider, configuration);
54+
55+
if (serviceProvider != null && provider.Options.RegisterServiceProvider)
56+
{
57+
provider.LogFactory.ServiceRepository.RegisterService(typeof(IServiceProvider), serviceProvider);
58+
}
59+
5360
if (configuration != null)
5461
{
5562
provider.Configure(configuration.GetSection("Logging:NLog"));

src/NLog.Extensions.Logging/Extensions/ConfigureExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,14 @@ private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serv
249249
private static NLogLoggerProvider CreateNLogLoggerProvider(IServiceProvider serviceProvider, IConfiguration configuration, NLogProviderOptions options, LogFactory logFactory)
250250
{
251251
NLogLoggerProvider provider = new NLogLoggerProvider(options ?? NLogProviderOptions.Default, logFactory ?? LogManager.LogFactory);
252+
252253
configuration = SetupConfiguration(serviceProvider, configuration);
254+
255+
if (serviceProvider != null && provider.Options.RegisterServiceProvider)
256+
{
257+
provider.LogFactory.ServiceRepository.RegisterService(typeof(IServiceProvider), serviceProvider);
258+
}
259+
253260
if (configuration != null)
254261
{
255262
provider.Configure(configuration.GetSection("Logging:NLog"));

src/NLog.Extensions.Logging/LayoutRenderers/ConfigSettingLayoutRenderer.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ namespace NLog.Extensions.Logging
3030
/// </example>
3131
[LayoutRenderer("configsetting")]
3232
[ThreadAgnostic]
33-
[ThreadSafe]
3433
public class ConfigSettingLayoutRenderer : LayoutRenderer
3534
{
35+
private IConfiguration _serviceConfiguration;
36+
3637
/// <summary>
3738
/// Global Configuration Container
3839
/// </summary>
@@ -66,14 +67,34 @@ public string Item
6667
///</summary>
6768
public string Default { get; set; }
6869

70+
/// <inheritdoc/>
71+
protected override void InitializeLayoutRenderer()
72+
{
73+
try
74+
{
75+
// Avoid NLogDependencyResolveException when possible
76+
if (!ReferenceEquals(ResolveService<IServiceProvider>(), LoggingConfiguration?.LogFactory?.ServiceRepository))
77+
{
78+
_serviceConfiguration = ResolveService<IConfiguration>();
79+
}
80+
}
81+
catch (NLogDependencyResolveException ex)
82+
{
83+
_serviceConfiguration = null;
84+
InternalLogger.Debug("ConfigSetting - Fallback to DefaultConfiguration: {0}", ex.Message);
85+
}
86+
87+
base.InitializeLayoutRenderer();
88+
}
89+
6990
/// <inheritdoc/>
7091
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
7192
{
7293
if (string.IsNullOrEmpty(_itemLookup))
7394
return;
7495

7596
string value = null;
76-
var configurationRoot = DefaultConfiguration;
97+
var configurationRoot = _serviceConfiguration ?? DefaultConfiguration;
7798
if (configurationRoot != null)
7899
{
79100
value = configurationRoot[_itemLookup];

src/NLog.Extensions.Logging/LayoutRenderers/MicrosoftConsoleLayoutRenderer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace NLog.Extensions.Logging
99
/// Renders output that simulates simple Microsoft Console Logger. Useful for Hosting Lifetime Startup Messages.
1010
/// </summary>
1111
[LayoutRenderer("MicrosoftConsoleLayout")]
12-
[ThreadSafe]
1312
[ThreadAgnostic]
1413
class MicrosoftConsoleLayoutRenderer : LayoutRenderer
1514
{

src/NLog.Extensions.Logging/Logging/NLogProviderOptions.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@ public class NLogProviderOptions
1313
public string EventIdSeparator { get; set; } = "_";
1414

1515
/// <summary>
16-
/// Skip allocation of <see cref="LogEventInfo.Properties" />-dictionary
16+
/// Skip creating "EventId_Id" and "EventId_Name" as <see cref="LogEventInfo.Properties" /> when <c>default(EventId)</c>
1717
/// </summary>
18-
/// <remarks>
19-
/// using
20-
/// <c>default(EventId)</c></remarks>
2118
public bool IgnoreEmptyEventId { get; set; } = true;
2219

2320
/// <summary>
@@ -79,7 +76,7 @@ public class NLogProviderOptions
7976
public bool RemoveLoggerFactoryFilter { get; set; } = true;
8077

8178
/// <summary>
82-
/// Replace Microsoft LoggerFactory with a pure <see cref="NLogLoggerFactory" />, and disables Microsoft Filter Logic and multiple LoggingProvider support.
79+
/// Replace Microsoft LoggerFactory with a pure <see cref="NLogLoggerFactory" />, and disables Microsoft Filter Logic and removes other LoggingProviders.
8380
/// </summary>
8481
/// <remarks>This option affects the building of service configuration, so assigning it from appsettings.json has no effect (loaded after).</remarks>
8582
public bool ReplaceLoggerFactory { get; set; }
@@ -98,6 +95,11 @@ public class NLogProviderOptions
9895
/// </remarks>
9996
public bool CaptureEntireEventId { get; set; }
10097

98+
/// <summary>
99+
/// Enable NLog Targets and Layouts to perform dependency lookup using the Microsoft Dependency Injection IServiceProvider
100+
/// </summary>
101+
public bool RegisterServiceProvider { get; set; } = true;
102+
101103
/// <summary>Initializes a new instance NLogProviderOptions with default values.</summary>
102104
public NLogProviderOptions()
103105
{

src/NLog.Extensions.Logging/NLog.Extensions.Logging.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
8181
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
8282
</PropertyGroup>
8383
<ItemGroup>
84-
<PackageReference Include="NLog" Version="5.0.0-preview.1" />
84+
<PackageReference Include="NLog" Version="5.0.0-preview.2" />
8585
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
8686
</ItemGroup>
8787
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ public void UseNLog_LoadConfigurationFromSection()
109109

110110
var loggerFact = host.Services.GetService<ILoggerFactory>();
111111
var logger = loggerFact.CreateLogger("logger1");
112+
113+
ConfigSettingLayoutRenderer.DefaultConfiguration = null; // See dependency resolving is working
114+
112115
logger.LogError("error1");
113116

114117
var loggerProvider = host.Services.GetService<ILoggerProvider>() as NLogLoggerProvider;

test/NLog.Extensions.Logging.Tests/CustomBeginScopeTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class CustomBeginScopeTest : NLogTestBase
1313
public void TestNonSerializableSayHello()
1414
{
1515
var runner = GetRunner<CustomBeginScopeTestRunner>();
16-
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${ndlc}" };
16+
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${scopenested}" };
1717
ConfigureNLog(target);
1818
runner.SayHello().Wait();
1919
Assert.Single(target.Logs);
@@ -24,7 +24,7 @@ public void TestNonSerializableSayHello()
2424
public void TestNonSerializableSayHelloWithScope()
2525
{
2626
var runner = GetRunner<CustomBeginScopeTestRunner>(new NLogProviderOptions { IncludeScopes = false });
27-
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${ndlc}" };
27+
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${scopenested}" };
2828
ConfigureNLog(target);
2929
runner.SayHello().Wait();
3030
Assert.Single(target.Logs);
@@ -35,7 +35,7 @@ public void TestNonSerializableSayHelloWithScope()
3535
public void TestNonSerializableSayHi()
3636
{
3737
var runner = GetRunner<CustomBeginScopeTestRunner>();
38-
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${ndlc}" };
38+
var target = new Targets.MemoryTarget { Layout = "${message} ${scopeproperty:World}. Welcome ${scopenested}" };
3939
ConfigureNLog(target);
4040
var scopeString = runner.SayHi().Result;
4141
Assert.Single(target.Logs);

0 commit comments

Comments
 (0)