Skip to content

Commit 015e00d

Browse files
committed
Get the configured log level switches through the Options object
Fixes serilog#206
1 parent 52e8750 commit 015e00d

File tree

6 files changed

+33
-9
lines changed

6 files changed

+33
-9
lines changed

src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ public static LoggerConfiguration Configuration(
216216
{ Assemblies: {} } => GetConfigurationReader(configuration, options, options.Assemblies),
217217
_ => GetConfigurationReader(configuration, options ?? new Options(), options?.DependencyContext),
218218
};
219+
if (options != null)
220+
{
221+
options.LogLevelSwitches = configurationReader.LogLevelSwitches;
222+
}
219223
return settingConfiguration.Settings(configurationReader);
220224
}
221225

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public void Configure(LoggerConfiguration loggerConfiguration)
5858
ApplyAuditSinks(loggerConfiguration);
5959
}
6060

61+
internal IReadOnlyDictionary<string, LoggingLevelSwitch> LogLevelSwitches => _resolutionContext.DeclaredLevelSwitches;
62+
6163
void ProcessFilterSwitchDeclarations()
6264
{
6365
var filterSwitchesDirective = _section.GetSection("FilterSwitches");

src/Serilog.Settings.Configuration/Settings/Configuration/Options.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Globalization;
22
using System.Reflection;
33
using Microsoft.Extensions.DependencyModel;
4+
using Serilog.Core;
45

56
namespace Serilog.Settings.Configuration;
67

@@ -56,6 +57,14 @@ public Options() : this(dependencyContext: null)
5657
/// </summary>
5758
public IFormatProvider FormatProvider { get; init; } = CultureInfo.InvariantCulture;
5859

60+
/// <summary>
61+
/// The log level switches that were loaded from the <c>LevelSwitches</c> section of the configuration.
62+
/// <para/>
63+
/// The log level switches are only available after calling the ReadFrom.Configuration() method.
64+
/// </summary>
65+
/// <remarks>The keys of the dictionary are the name of the switches, including the leading <c>$</c> character.</remarks>
66+
public IReadOnlyDictionary<string, LoggingLevelSwitch> LogLevelSwitches { get; internal set; } = new Dictionary<string, LoggingLevelSwitch>();
67+
5968
internal Assembly[] Assemblies { get; }
6069
internal DependencyContext DependencyContext { get; }
6170
internal ConfigurationAssemblySource? ConfigurationAssemblySource { get; }

src/Serilog.Settings.Configuration/Settings/Configuration/ResolutionContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Serilog.Settings.Configuration;
99
/// </summary>
1010
sealed class ResolutionContext
1111
{
12-
readonly IDictionary<string, LoggingLevelSwitch> _declaredLevelSwitches;
12+
readonly Dictionary<string, LoggingLevelSwitch> _declaredLevelSwitches;
1313
readonly IDictionary<string, LoggingFilterSwitchProxy> _declaredFilterSwitches;
1414
readonly IConfiguration _appConfiguration;
1515

@@ -23,6 +23,8 @@ public ResolutionContext(IConfiguration appConfiguration = null, IFormatProvider
2323

2424
public IFormatProvider FormatProvider { get; }
2525

26+
internal IReadOnlyDictionary<string, LoggingLevelSwitch> DeclaredLevelSwitches => _declaredLevelSwitches;
27+
2628
/// <summary>
2729
/// Looks up a switch in the declared LoggingLevelSwitches
2830
/// </summary>

test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ namespace Serilog.Settings.Configuration.Tests;
1111

1212
public class ConfigurationSettingsTests
1313
{
14-
static LoggerConfiguration ConfigFromJson(string jsonString, string secondJsonSource = null)
14+
static LoggerConfiguration ConfigFromJson(string jsonString, string secondJsonSource = null, Options options = null)
1515
{
16-
return ConfigFromJson(jsonString, secondJsonSource, out _);
16+
return ConfigFromJson(jsonString, secondJsonSource, out _, options);
1717
}
1818

19-
static LoggerConfiguration ConfigFromJson(string jsonString, out IConfiguration configuration)
19+
static LoggerConfiguration ConfigFromJson(string jsonString, out IConfiguration configuration, Options options = null)
2020
{
21-
return ConfigFromJson(jsonString, null, out configuration);
21+
return ConfigFromJson(jsonString, null, out configuration, options);
2222
}
2323

24-
static LoggerConfiguration ConfigFromJson(string jsonString, string secondJsonSource, out IConfiguration configuration)
24+
static LoggerConfiguration ConfigFromJson(string jsonString, string secondJsonSource, out IConfiguration configuration, Options options)
2525
{
2626
var builder = new ConfigurationBuilder().AddJsonString(jsonString);
2727
if (secondJsonSource != null)
2828
builder.AddJsonString(secondJsonSource);
2929
configuration = builder.Build();
3030
return new LoggerConfiguration()
31-
.ReadFrom.Configuration(configuration);
31+
.ReadFrom.Configuration(configuration, options);
3232
}
3333

3434
[Fact]
@@ -385,10 +385,13 @@ public void LoggingLevelSwitchIsConfigured(string switchName)
385385
}}";
386386
LogEvent evt = null;
387387

388-
var log = ConfigFromJson(json)
388+
var options = new Options();
389+
var log = ConfigFromJson(json, options: options)
389390
.WriteTo.Sink(new DelegatingSink(e => evt = e))
390391
.CreateLogger();
391392

393+
Assert.Contains("$switch1", options.LogLevelSwitches);
394+
Assert.Equal(LogEventLevel.Warning, options.LogLevelSwitches["$switch1"].MinimumLevel);
392395
log.Write(Some.DebugEvent());
393396
Assert.True(evt is null, "LoggingLevelSwitch initial level was Warning. It should not log Debug messages");
394397
log.Write(Some.InformationEvent());

test/Serilog.Settings.Configuration.Tests/DynamicLevelChangeTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,14 @@ public DynamicLevelChangeTests()
4545
[Fact]
4646
public void ShouldRespectDynamicLevelChanges()
4747
{
48+
var options = new Options();
4849
using var logger = new LoggerConfiguration()
4950
.ReadFrom
50-
.Configuration(new ConfigurationBuilder().Add(_configSource).Build())
51+
.Configuration(new ConfigurationBuilder().Add(_configSource).Build(), options)
5152
.CreateLogger();
5253

54+
Assert.Equal(LogEventLevel.Information, options.LogLevelSwitches["$mySwitch"].MinimumLevel);
55+
5356
DummyConsoleSink.Emitted.Clear();
5457
logger.Write(Some.DebugEvent());
5558
Assert.Empty(DummyConsoleSink.Emitted);
@@ -64,6 +67,7 @@ public void ShouldRespectDynamicLevelChanges()
6467
logger.Write(Some.DebugEvent());
6568
logger.ForContext(Constants.SourceContextPropertyName, "Root.Test").Write(Some.DebugEvent());
6669
Assert.Single(DummyConsoleSink.Emitted);
70+
Assert.Equal(LogEventLevel.Debug, options.LogLevelSwitches["$mySwitch"].MinimumLevel);
6771

6872
DummyConsoleSink.Emitted.Clear();
6973
UpdateConfig(overrideLevel: LogEventLevel.Debug);

0 commit comments

Comments
 (0)