Skip to content

Commit 1e7f866

Browse files
author
Sergey Komisarchik
committed
https://github.com/serilog/serilog-settings-configuration/issues/10
1 parent e0ad8ad commit 1e7f866

File tree

2 files changed

+37
-17
lines changed

2 files changed

+37
-17
lines changed

sample/Sample/appsettings.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
{
22
"Serilog": {
33
"Using": ["Serilog.Sinks.Literate"],
4-
"MinimumLevel": "Debug",
4+
"MinimumLevel": {
5+
"Default": "Debug",
6+
"Override": {
7+
"Microsoft": "Warning",
8+
"MyApp.Something.Tricky": "Verbose"
9+
}
10+
},
511
"WriteTo": [
612
{ "Name": "LiterateConsole" },
713
{

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

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,25 +100,39 @@ Dictionary<string, Dictionary<string, string>> GetMethodCalls(IConfigurationSect
100100

101101
void ApplyMinimumLevel(LoggerConfiguration loggerConfiguration)
102102
{
103+
var applyMinimumLevelAction =
104+
new Action<IConfigurationSection, Action<LoggerMinimumLevelConfiguration, LoggingLevelSwitch>>(
105+
(directive, applyConfigAction) =>
106+
{
107+
LogEventLevel minimumLevel;
108+
if (!Enum.TryParse(directive.Value, out minimumLevel))
109+
throw new InvalidOperationException($"The value {directive.Value} is not a valid Serilog level.");
110+
111+
var levelSwitch = new LoggingLevelSwitch(minimumLevel);
112+
applyConfigAction(loggerConfiguration.MinimumLevel, levelSwitch);
113+
114+
ChangeToken.OnChange(
115+
directive.GetReloadToken,
116+
() =>
117+
{
118+
if (Enum.TryParse(directive.Value, out minimumLevel))
119+
levelSwitch.MinimumLevel = minimumLevel;
120+
else
121+
SelfLog.WriteLine($"The value {directive.Value} is not a valid Serilog level.");
122+
});
123+
});
124+
103125
var minimumLevelDirective = _configuration.GetSection("MinimumLevel");
104-
if (minimumLevelDirective?.Value != null)
105-
{
106-
LogEventLevel minimumLevel;
107-
if (!Enum.TryParse(minimumLevelDirective.Value, out minimumLevel))
108-
throw new InvalidOperationException($"The value {minimumLevelDirective.Value} is not a valid Serilog level.");
109126

110-
var levelSwitch = new LoggingLevelSwitch(minimumLevel);
111-
loggerConfiguration.MinimumLevel.ControlledBy(levelSwitch);
127+
var defaultMinLevelDirective = minimumLevelDirective.Value != null ? minimumLevelDirective : minimumLevelDirective.GetSection("Default");
128+
if (defaultMinLevelDirective.Value != null)
129+
{
130+
applyMinimumLevelAction(defaultMinLevelDirective, (configuration, levelSwitch) => configuration.ControlledBy(levelSwitch));
131+
}
112132

113-
ChangeToken.OnChange(
114-
() => minimumLevelDirective.GetReloadToken(),
115-
() =>
116-
{
117-
if (Enum.TryParse(minimumLevelDirective.Value, out minimumLevel))
118-
levelSwitch.MinimumLevel = minimumLevel;
119-
else
120-
SelfLog.WriteLine($"The value {minimumLevelDirective.Value} is not a valid Serilog level.");
121-
});
133+
foreach (var overrideDirective in minimumLevelDirective.GetSection("Override").GetChildren())
134+
{
135+
applyMinimumLevelAction(overrideDirective, (configuration, levelSwitch) => configuration.Override(overrideDirective.Key, levelSwitch));
122136
}
123137
}
124138

0 commit comments

Comments
 (0)