Skip to content

Commit 80b2ec9

Browse files
committed
populate value for an IConfiguration parameter on target method
1 parent 82375c0 commit 80b2ec9

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public static class ConfigurationLoggerConfigurationExtensions
3232
public const string DefaultSectionName = "Serilog";
3333

3434
/// <summary>
35-
/// Reads logger settings from the provided configuration object using the default section name.
35+
/// Reads logger settings from the provided configuration object using the default section name. Generally this
36+
/// is preferable over the other method that takes a configuration section. Only this version will populate
37+
/// IConfiguration parameters on target methods.
3638
/// </summary>
3739
/// <param name="settingConfiguration">Logger setting configuration.</param>
38-
/// <param name="configuration">A configuration object with a Serilog section.</param>
40+
/// <param name="configuration">A configuration object which contains a Serilog section.</param>
3941
/// <param name="dependencyContext">The dependency context from which sink/enricher packages can be located. If not supplied, the platform
4042
/// default will be used.</param>
4143
/// <returns>An object allowing configuration to continue.</returns>
@@ -45,28 +47,32 @@ public static LoggerConfiguration Configuration(
4547
DependencyContext dependencyContext = null)
4648
{
4749
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
48-
return settingConfiguration.ConfigurationSection(configuration.GetSection(DefaultSectionName), dependencyContext);
50+
return settingConfiguration.Settings(
51+
new ConfigurationReader(
52+
configuration,
53+
dependencyContext ?? (Assembly.GetEntryAssembly() != null ? DependencyContext.Default : null)));
4954
}
5055

5156
/// <summary>
52-
/// Reads logger settings from the provided configuration section.
57+
/// Reads logger settings from the provided configuration section. Generally it is preferable to use the other
58+
/// extension method that takes the full configuration object.
5359
/// </summary>
5460
/// <param name="settingConfiguration">Logger setting configuration.</param>
55-
/// <param name="configuration">The Serilog configuration section</param>
61+
/// <param name="configSection">The Serilog configuration section</param>
5662
/// <param name="dependencyContext">The dependency context from which sink/enricher packages can be located. If not supplied, the platform
5763
/// default will be used.</param>
5864
/// <returns>An object allowing configuration to continue.</returns>
5965
public static LoggerConfiguration ConfigurationSection(
6066
this LoggerSettingsConfiguration settingConfiguration,
61-
IConfigurationSection configuration,
67+
IConfigurationSection configSection,
6268
DependencyContext dependencyContext = null)
6369
{
6470
if (settingConfiguration == null) throw new ArgumentNullException(nameof(settingConfiguration));
65-
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
71+
if (configSection == null) throw new ArgumentNullException(nameof(configSection));
6672

6773
return settingConfiguration.Settings(
6874
new ConfigurationReader(
69-
configuration,
75+
configSection,
7076
dependencyContext ?? (Assembly.GetEntryAssembly() != null ? DependencyContext.Default : null)));
7177
}
7278
}

src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
<PackageProjectUrl>https://github.com/serilog/serilog-settings-configuration</PackageProjectUrl>
1818
<PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
1919
<RootNamespace>Serilog</RootNamespace>
20-
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
21-
<Version>3.0.0.002</Version>
20+
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
21+
<Version>3.0.0</Version>
22+
<AssemblyVersion>3.0.0.0</AssemblyVersion>
23+
<FileVersion>3.0.0</FileVersion>
2224
</PropertyGroup>
2325

2426
<ItemGroup>

src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,35 @@ class ConfigurationReader : IConfigurationReader
2121
const string LevelSwitchNameRegex = @"^\$[A-Za-z]+[A-Za-z0-9]*$";
2222
const string ConfigSectionHintChar = ">";
2323

24-
readonly IConfigurationSection _configuration;
24+
static IConfiguration _configuration;
25+
26+
readonly IConfigurationSection _section;
2527
readonly DependencyContext _dependencyContext;
2628
readonly IReadOnlyCollection<Assembly> _configurationAssemblies;
2729

2830
#region Constructors
2931

30-
public ConfigurationReader(IConfigurationSection configuration, DependencyContext dependencyContext)
32+
public ConfigurationReader(IConfiguration configuration, DependencyContext dependencyContext)
3133
{
3234
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
35+
_section = configuration.GetSection(ConfigurationLoggerConfigurationExtensions.DefaultSectionName);
3336
_dependencyContext = dependencyContext;
3437
_configurationAssemblies = LoadConfigurationAssemblies();
3538
}
3639

37-
ConfigurationReader(IConfigurationSection configuration, IReadOnlyCollection<Assembly> configurationAssemblies, DependencyContext dependencyContext)
40+
// Generally the initial call should use IConfiguration rather than IConfigurationSection, otherwise
41+
// IConfiguration parameters in the target methods will not be populated.
42+
ConfigurationReader(IConfigurationSection configSection, DependencyContext dependencyContext)
3843
{
39-
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
44+
_section = configSection ?? throw new ArgumentNullException(nameof(configSection));
45+
_dependencyContext = dependencyContext;
46+
_configurationAssemblies = LoadConfigurationAssemblies();
47+
}
48+
49+
// Used internally for processing nested configuration sections -- see GetMethodCalls below.
50+
ConfigurationReader(IConfigurationSection configSection, IReadOnlyCollection<Assembly> configurationAssemblies, DependencyContext dependencyContext)
51+
{
52+
_section = configSection ?? throw new ArgumentNullException(nameof(configSection));
4053
_dependencyContext = dependencyContext;
4154
_configurationAssemblies = configurationAssemblies ?? throw new ArgumentNullException(nameof(configurationAssemblies));
4255
}
@@ -45,7 +58,6 @@ public ConfigurationReader(IConfigurationSection configuration, DependencyContex
4558

4659
#region Configure and related Apply methods
4760

48-
// Called by LoggerConfiguration in Serilog Core
4961
public void Configure(LoggerConfiguration loggerConfiguration)
5062
{
5163
var declaredLevelSwitches = ProcessLevelSwitchDeclarations();
@@ -58,7 +70,7 @@ public void Configure(LoggerConfiguration loggerConfiguration)
5870

5971
IReadOnlyDictionary<string, LoggingLevelSwitch> ProcessLevelSwitchDeclarations()
6072
{
61-
var levelSwitchesDirective = _configuration.GetSection("LevelSwitches");
73+
var levelSwitchesDirective = _section.GetSection("LevelSwitches");
6274
var namedSwitches = new Dictionary<string, LoggingLevelSwitch>();
6375
foreach (var levelSwitchDeclaration in levelSwitchesDirective.GetChildren())
6476
{
@@ -86,7 +98,7 @@ IReadOnlyDictionary<string, LoggingLevelSwitch> ProcessLevelSwitchDeclarations()
8698

8799
void ApplyMinimumLevel(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
88100
{
89-
var minimumLevelDirective = _configuration.GetSection("MinimumLevel");
101+
var minimumLevelDirective = _section.GetSection("MinimumLevel");
90102

91103
var defaultMinLevelDirective = minimumLevelDirective.Value != null ? minimumLevelDirective : minimumLevelDirective.GetSection("Default");
92104
if (defaultMinLevelDirective.Value != null)
@@ -139,7 +151,7 @@ void ApplyMinimumLevel(IConfigurationSection directive, Action<LoggerMinimumLeve
139151

140152
void ApplyFilters(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
141153
{
142-
var filterDirective = _configuration.GetSection("Filter");
154+
var filterDirective = _section.GetSection("Filter");
143155
if (filterDirective.GetChildren().Any())
144156
{
145157
var methodCalls = GetMethodCalls(filterDirective);
@@ -149,7 +161,7 @@ void ApplyFilters(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<s
149161

150162
void ApplySinks(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
151163
{
152-
var writeToDirective = _configuration.GetSection("WriteTo");
164+
var writeToDirective = _section.GetSection("WriteTo");
153165
if (writeToDirective.GetChildren().Any())
154166
{
155167
var methodCalls = GetMethodCalls(writeToDirective);
@@ -159,7 +171,7 @@ void ApplySinks(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<str
159171

160172
void ApplyAuditSinks(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
161173
{
162-
var auditToDirective = _configuration.GetSection("AuditTo");
174+
var auditToDirective = _section.GetSection("AuditTo");
163175
if (auditToDirective.GetChildren().Any())
164176
{
165177
var methodCalls = GetMethodCalls(auditToDirective);
@@ -169,20 +181,20 @@ void ApplyAuditSinks(LoggerConfiguration loggerConfiguration, IReadOnlyDictionar
169181

170182
void IConfigurationReader.ApplySinks(LoggerSinkConfiguration loggerSinkConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
171183
{
172-
var methodCalls = GetMethodCalls(_configuration);
184+
var methodCalls = GetMethodCalls(_section);
173185
CallConfigurationMethods(methodCalls, FindSinkConfigurationMethods(_configurationAssemblies), loggerSinkConfiguration, declaredLevelSwitches);
174186
}
175187

176188
void ApplyEnrichment(LoggerConfiguration loggerConfiguration, IReadOnlyDictionary<string, LoggingLevelSwitch> declaredLevelSwitches)
177189
{
178-
var enrichDirective = _configuration.GetSection("Enrich");
190+
var enrichDirective = _section.GetSection("Enrich");
179191
if (enrichDirective.GetChildren().Any())
180192
{
181193
var methodCalls = GetMethodCalls(enrichDirective);
182194
CallConfigurationMethods(methodCalls, FindEventEnricherConfigurationMethods(_configurationAssemblies), loggerConfiguration.Enrich, declaredLevelSwitches);
183195
}
184196

185-
var propertiesDirective = _configuration.GetSection("Properties");
197+
var propertiesDirective = _section.GetSection("Properties");
186198
if (propertiesDirective.GetChildren().Any())
187199
{
188200
foreach (var enrichProperyDirective in propertiesDirective.GetChildren())
@@ -253,7 +265,7 @@ IReadOnlyCollection<Assembly> LoadConfigurationAssemblies()
253265
{
254266
var assemblies = new Dictionary<string, Assembly>();
255267

256-
var usingSection = _configuration.GetSection("Using");
268+
var usingSection = _section.GetSection("Using");
257269
if (usingSection.GetChildren().Any())
258270
{
259271
foreach (var simpleName in usingSection.GetChildren().Select(c => c.Value))
@@ -314,6 +326,9 @@ static void CallConfigurationMethods(ILookup<string, Dictionary<string, IConfigu
314326
let directive = method.Value.FirstOrDefault(s => s.Key == p.Name)
315327
select directive.Key == null ? p.DefaultValue : directive.Value.ConvertTo(p.ParameterType, declaredLevelSwitches)).ToList();
316328

329+
var parm = methodInfo.GetParameters().FirstOrDefault(i => i.ParameterType == typeof(IConfiguration));
330+
if(parm != null) call[parm.Position - 1] = _configuration;
331+
317332
call.Insert(0, receiver);
318333

319334
methodInfo.Invoke(null, call.ToArray());

0 commit comments

Comments
 (0)