Skip to content

Commit 86ce1c1

Browse files
snakefoot304NotModified
authored andcommitted
Configure NLogProviderOptions from appsettings.json (#248)
* NLogLoggerProvider - Added constructor with isolated NLog LogFactory * Configure NLogProviderOptions from appsettings.json * Configure NLogProviderOptions from appsettings.json (code review)
1 parent 13a841c commit 86ce1c1

File tree

12 files changed

+197
-3162
lines changed

12 files changed

+197
-3162
lines changed

examples/NetCore2/ConsoleExample/ConsoleExample.csproj

+6-2
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
13-
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.1" />
12+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
13+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.0" />
14+
<PackageReference Include="NLog.Schema" Version="4.5.11" />
1415
</ItemGroup>
1516

1617
<ItemGroup>
1718
<ProjectReference Include="..\..\..\src\NLog.Extensions.Logging\NLog.Extensions.Logging.csproj" />
1819
</ItemGroup>
1920

2021
<ItemGroup>
22+
<None Update="appsettings.json">
23+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
24+
</None>
2125
<None Update="nlog.config">
2226
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
2327
</None>

examples/NetCore2/ConsoleExample/NLog.xsd

-3,106
This file was deleted.

examples/NetCore2/ConsoleExample/Program.cs

+17-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using System;
2+
using Microsoft.Extensions.Configuration;
3+
using Microsoft.Extensions.DependencyInjection;
24
using Microsoft.Extensions.Logging;
35
using NLog;
46
using NLog.Extensions.Logging;
5-
using System;
6-
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
77

88
namespace ConsoleExample
99
{
@@ -44,21 +44,20 @@ private static IServiceProvider BuildDi()
4444
// Runner is the custom class
4545
services.AddTransient<Runner>();
4646

47-
services.AddSingleton<ILoggerFactory, LoggerFactory>();
48-
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
49-
services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));
47+
var config = new ConfigurationBuilder()
48+
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
49+
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
50+
.Build();
5051

51-
var serviceProvider = services.BuildServiceProvider();
52-
53-
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
54-
55-
// configure NLog
56-
loggerFactory.AddNLog(new NLogProviderOptions
52+
// configure Logging with NLog
53+
services.AddLogging(loggingBuilder =>
5754
{
58-
CaptureMessageTemplates = true,
59-
CaptureMessageProperties = true
55+
loggingBuilder.ClearProviders();
56+
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
57+
loggingBuilder.AddNLog(config);
6058
});
6159

60+
var serviceProvider = services.BuildServiceProvider();
6261
return serviceProvider;
6362
}
6463
}
@@ -75,6 +74,10 @@ public Runner(ILogger<Runner> logger)
7574
public void DoAction(string name)
7675
{
7776
_logger.LogDebug(20, "Doing hard work! {Action}", name);
77+
_logger.LogInformation(21, "Doing hard work! {Action}", name);
78+
_logger.LogWarning(22, "Doing hard work! {Action}", name);
79+
_logger.LogError(23, "Doing hard work! {Action}", name);
80+
_logger.LogCritical(24, "Doing hard work! {Action}", name);
7881
}
7982
}
8083
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"Logging": {
3+
"NLog": {
4+
"IncludeScopes": false,
5+
"ParseMessageTemplates": true,
6+
"CaptureMessageProperties": true
7+
}
8+
}
9+
}

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,17 @@ public static IHostBuilder UseNLog(this IHostBuilder builder, NLogProviderOption
4141
ConfigurationItemFactory.Default.RegisterItemsFromAssembly(typeof(ConfigureExtensions).GetTypeInfo()
4242
.Assembly);
4343

44-
services.AddSingleton(new LoggerFactory().AddNLog(options));
44+
services.AddSingleton<ILoggerProvider>(serviceProvider =>
45+
{
46+
var provider = new NLogLoggerProvider(options ?? new NLogProviderOptions());
47+
if (hostbuilder.Configuration != null)
48+
{
49+
// TODO ConfigSettingLayoutRenderer.DefaultConfiguration = hostbuilder.Configuration;
50+
if (options == null)
51+
provider.Configure(hostbuilder.Configuration?.GetSection("Logging:NLog"));
52+
}
53+
return provider;
54+
});
4555
});
4656

4757
return builder;

src/NLog.Extensions.Hosting/NLog.Extensions.Hosting.csproj

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<DebugType>full</DebugType>
6-
<DebugSymbols>true</DebugSymbols>
5+
<DebugType Condition=" '$(Configuration)' == 'Debug' ">Full</DebugType>
76
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
87
<GenerateDocumentationFile>true</GenerateDocumentationFile>
98

@@ -28,7 +27,7 @@
2827
<AssemblyOriginatorKeyFile>..\NLog.snk</AssemblyOriginatorKeyFile>
2928
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
3029
</PropertyGroup>
31-
30+
3231
<ItemGroup>
3332
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.1.0" />
3433
</ItemGroup>

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

+78-7
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
using System;
2+
using System.Linq;
23
using System.Reflection;
4+
using Microsoft.Extensions.Configuration;
35
using Microsoft.Extensions.Logging;
46
using NLog.Common;
57
using NLog.Config;
68

79
namespace NLog.Extensions.Logging
810
{
911
/// <summary>
10-
/// Helpers for .NET Core
12+
/// Helpers for configuring NLog for Microsoft Extension Logging (MEL)
1113
/// </summary>
1214
public static class ConfigureExtensions
1315
{
1416
/// <summary>
15-
/// Enable NLog as logging provider in .NET Core.
17+
/// Enable NLog as logging provider for Microsoft Extension Logging
1618
/// </summary>
1719
/// <param name="factory"></param>
1820
/// <returns>ILoggerFactory for chaining</returns>
1921
public static ILoggerFactory AddNLog(this ILoggerFactory factory)
2022
{
21-
return AddNLog(factory, null);
23+
return factory.AddNLog(NLogProviderOptions.Default);
2224
}
2325

2426
/// <summary>
25-
/// Enable NLog as logging provider in .NET Core.
27+
/// Enable NLog as logging provider for Microsoft Extension Logging
2628
/// </summary>
2729
/// <param name="factory"></param>
2830
/// <param name="options">NLog options</param>
@@ -33,19 +35,45 @@ public static ILoggerFactory AddNLog(this ILoggerFactory factory, NLogProviderOp
3335
return factory;
3436
}
3537

38+
/// <summary>
39+
/// Enable NLog as logging provider for Microsoft Extension Logging
40+
/// </summary>
41+
/// <param name="factory"></param>
42+
/// <param name="configuration"></param>
43+
/// <returns>ILoggerFactory for chaining</returns>
44+
public static ILoggerFactory AddNLog(this ILoggerFactory factory, IConfiguration configuration)
45+
{
46+
var provider = CreateNLogProvider(configuration);
47+
factory.AddProvider(provider);
48+
return factory;
49+
}
50+
3651
#if !NETCORE1_0
3752
/// <summary>
38-
/// Enable NLog as logging provider in .NET Core.
53+
/// Enable NLog as logging provider for Microsoft Extension Logging
3954
/// </summary>
4055
/// <param name="factory"></param>
4156
/// <returns>ILoggerFactory for chaining</returns>
4257
public static ILoggingBuilder AddNLog(this ILoggingBuilder factory)
4358
{
44-
return AddNLog(factory, null);
59+
return factory.AddNLog(NLogProviderOptions.Default);
4560
}
4661

4762
/// <summary>
48-
/// Enable NLog as logging provider in .NET Core.
63+
/// Enable NLog as logging provider for Microsoft Extension Logging
64+
/// </summary>
65+
/// <param name="factory"></param>
66+
/// <param name="configuration">Configuration</param>
67+
/// <returns>ILoggerFactory for chaining</returns>
68+
public static ILoggingBuilder AddNLog(this ILoggingBuilder factory, IConfiguration configuration)
69+
{
70+
var provider = CreateNLogProvider(configuration);
71+
factory.AddProvider(provider);
72+
return factory;
73+
}
74+
75+
/// <summary>
76+
/// Enable NLog as logging provider for Microsoft Extension Logging
4977
/// </summary>
5078
/// <param name="factory"></param>
5179
/// <param name="options">NLog options</param>
@@ -83,5 +111,48 @@ public static LoggingConfiguration ConfigureNLog(this ILoggerFactory loggerFacto
83111
LogManager.Configuration = config;
84112
return config;
85113
}
114+
115+
/// <summary>
116+
/// Factory method for <see cref="NLogLoggerProvider"/>
117+
/// </summary>
118+
/// <param name="nlogProvider"></param>
119+
/// <param name="configurationSection">Microsoft Extension Configuration</param>
120+
/// <returns></returns>
121+
public static NLogLoggerProvider Configure(this NLogLoggerProvider nlogProvider, IConfigurationSection configurationSection)
122+
{
123+
if (configurationSection == null)
124+
return nlogProvider;
125+
126+
var configProps = nlogProvider.Options.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.SetMethod?.IsPublic == true).ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);
127+
foreach (var configValue in configurationSection.GetChildren())
128+
{
129+
if (configProps.TryGetValue(configValue.Key, out var propertyInfo))
130+
{
131+
try
132+
{
133+
var result = Convert.ChangeType(configValue.Value, propertyInfo.PropertyType);
134+
propertyInfo.SetMethod.Invoke(nlogProvider.Options, new[] { result });
135+
}
136+
catch (Exception ex)
137+
{
138+
InternalLogger.Warn(ex, "NLogProviderOptions: Property {0} could not be assigned value: {1}", configValue.Key, configValue.Value);
139+
}
140+
}
141+
}
142+
143+
return nlogProvider;
144+
}
145+
146+
private static NLogLoggerProvider CreateNLogProvider(IConfiguration configuration)
147+
{
148+
var provider = new NLogLoggerProvider(new NLogProviderOptions());
149+
if (configuration != null)
150+
{
151+
// TODO ConfigSettingLayoutRenderer.DefaultConfiguration = configuration;
152+
provider.Configure(configuration.GetSection("Logging:NLog"));
153+
}
154+
155+
return provider;
156+
}
86157
}
87158
}

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

+20-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@ namespace NLog.Extensions.Logging
1515
#endif
1616
public class NLogLoggerProvider : Microsoft.Extensions.Logging.ILoggerProvider
1717
{
18+
private NLogBeginScopeParser _beginScopeParser;
19+
1820
/// <summary>
1921
/// NLog options
2022
/// </summary>
2123
public NLogProviderOptions Options { get; set; }
22-
private NLogBeginScopeParser _beginScopeParser;
24+
25+
/// <summary>
26+
/// NLog Factory
27+
/// </summary>
28+
public LogFactory LogFactory { get; }
2329

2430
/// <summary>
2531
/// New provider with default options, see <see cref="Options"/>
@@ -34,7 +40,18 @@ public NLogLoggerProvider()
3440
/// </summary>
3541
/// <param name="options"></param>
3642
public NLogLoggerProvider(NLogProviderOptions options)
43+
:this(options, null)
44+
{
45+
}
46+
47+
/// <summary>
48+
/// New provider with options
49+
/// </summary>
50+
/// <param name="options"></param>
51+
/// <param name="logFactory">Optional isolated NLog LogFactory</param>
52+
public NLogLoggerProvider(NLogProviderOptions options, LogFactory logFactory)
3753
{
54+
LogFactory = logFactory ?? LogManager.LogFactory;
3855
Options = options ?? NLogProviderOptions.Default;
3956
_beginScopeParser = new NLogBeginScopeParser(options);
4057
RegisterHiddenAssembliesForCallSite();
@@ -50,7 +67,7 @@ public Microsoft.Extensions.Logging.ILogger CreateLogger(string name)
5067
var beginScopeParser = ((Options?.CaptureMessageProperties ?? true) && (Options?.IncludeScopes ?? true))
5168
? (_beginScopeParser ?? System.Threading.Interlocked.CompareExchange(ref _beginScopeParser, new NLogBeginScopeParser(Options), null))
5269
: null;
53-
return new NLogLogger(LogManager.GetLogger(name), Options, beginScopeParser);
70+
return new NLogLogger(LogFactory.GetLogger(name), Options, beginScopeParser);
5471
}
5572

5673
/// <summary>
@@ -70,7 +87,7 @@ protected virtual void Dispose(bool disposing)
7087
{
7188
if (disposing)
7289
{
73-
LogManager.Flush();
90+
LogFactory.Flush();
7491
}
7592
}
7693

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

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
44

55
<TargetFrameworks>net451;net461;netstandard1.3;netstandard1.5;netstandard2.0</TargetFrameworks>
6-
<DebugType>full</DebugType>
7-
<DebugSymbols>true</DebugSymbols>
6+
<DebugType Condition=" '$(Configuration)' == 'Debug' ">Full</DebugType>
87
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
98
<GenerateDocumentationFile>true</GenerateDocumentationFile>
109

@@ -17,7 +16,7 @@
1716

1817
For ASP.NET Core, use NLog.Web.AspNetCore: https://www.nuget.org/packages/NLog.Web.AspNetCore
1918
</Description>
20-
<PackageTags>NLog;Microsoft.Extensions.Logging;log;logfiles;netcore;nlog</PackageTags>
19+
<PackageTags>NLog;Microsoft.Extensions.Logging;log;logfiles;netcore</PackageTags>
2120
<PackageReleaseNotes>
2221

2322
- Added ${configsetting} for appsettings.json and others (@snakefoot)
@@ -64,29 +63,33 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
6463
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
6564
</PropertyGroup>
6665
<ItemGroup>
67-
<PackageReference Include="NLog" Version="[4.5.10,5.0.0-beta01)" />
66+
<PackageReference Include="NLog" Version="[4.5.11,5.0.0-beta01)" />
6867
</ItemGroup>
6968
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
70-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.2" />
69+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.0.0" />
70+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.0" />
7171
<Reference Include="System" />
7272
<Reference Include="Microsoft.CSharp" />
7373
</ItemGroup>
7474
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
75-
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.1" />
75+
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0" />
7676
<Reference Include="System" />
7777
<Reference Include="Microsoft.CSharp" />
7878
</ItemGroup>
7979
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
80-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.2" />
80+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.0.0" />
81+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.0" />
8182
</ItemGroup>
8283
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">
83-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.2" />
84+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.0.0" />
85+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.0" />
8486
</ItemGroup>
8587
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
86-
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.1" />
88+
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0" />
8789
</ItemGroup>
8890

8991
<PropertyGroup>
9092
<AssemblyTitle>$(Title)</AssemblyTitle>
9193
</PropertyGroup>
9294
</Project>
95+

0 commit comments

Comments
 (0)