Skip to content

Commit 2846a75

Browse files
authored
Merge pull request #395 from serilog/dev
7.0.1 Release
2 parents e878335 + e92f201 commit 2846a75

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

Diff for: src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<Description>Microsoft.Extensions.Configuration (appsettings.json) support for Serilog.</Description>
55
<!-- This must match the major and minor components of the referenced Microsoft.Extensions.Logging package. -->
6-
<VersionPrefix>7.0.0</VersionPrefix>
6+
<VersionPrefix>7.0.1</VersionPrefix>
77
<Authors>Serilog Contributors</Authors>
88
<!-- These must match the Dependencies tab in https://www.nuget.org/packages/microsoft.settings.configuration at
99
the target version. -->

Diff for: src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

+12-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class ConfigurationReader : IConfigurationReader
1717
{
1818
const string LevelSwitchNameRegex = @"^\${0,1}[A-Za-z]+[A-Za-z0-9]*$";
1919

20+
// Section names that can be handled by Serilog itself (hence builtin) without requiring any additional assemblies.
21+
static readonly string[] BuiltinSectionNames = { "LevelSwitches", "MinimumLevel", "Properties" };
22+
2023
readonly IConfiguration _section;
2124
readonly IReadOnlyCollection<Assembly> _configurationAssemblies;
2225
readonly ResolutionContext _resolutionContext;
@@ -164,7 +167,7 @@ void ApplyMinimumLevel(LoggerConfiguration loggerConfiguration)
164167
{
165168
var overridePrefix = overrideDirective.Key;
166169
var overridenLevelOrSwitch = overrideDirective.Value;
167-
if (Enum.TryParse(overridenLevelOrSwitch, out LogEventLevel _))
170+
if (Enum.TryParse(overridenLevelOrSwitch, ignoreCase: true, out LogEventLevel _))
168171
{
169172
ApplyMinimumLevelConfiguration(overrideDirective, (configuration, levelSwitch) =>
170173
{
@@ -221,7 +224,7 @@ void SubscribeToLoggingLevelChanges(IConfigurationSection levelSection, LoggingL
221224
levelSection.GetReloadToken,
222225
() =>
223226
{
224-
if (Enum.TryParse(levelSection.Value, out LogEventLevel minimumLevel))
227+
if (Enum.TryParse(levelSection.Value, ignoreCase: true, out LogEventLevel minimumLevel))
225228
levelSwitch.MinimumLevel = minimumLevel;
226229
else
227230
SelfLog.WriteLine($"The value {levelSection.Value} is not a valid Serilog level.");
@@ -383,7 +386,10 @@ static IReadOnlyCollection<Assembly> LoadConfigurationAssemblies(IConfiguration
383386
assemblies.Add(assumed);
384387
}
385388

386-
if (assemblies.Count == 1)
389+
// We don't want to throw if the configuration contains only sections that can be handled by Serilog itself, without requiring any additional assembly.
390+
// See https://github.com/serilog/serilog-settings-configuration/issues/389
391+
var requiresAdditionalAssemblies = section.GetChildren().Select(e => e.Key).Except(BuiltinSectionNames).Any();
392+
if (assemblies.Count == 1 && requiresAdditionalAssemblies)
387393
{
388394
var message = $"""
389395
No {usingSection.Path} configuration section is defined and no Serilog assemblies were found.
@@ -591,9 +597,7 @@ internal static bool IsValidSwitchName(string input)
591597
}
592598

593599
static LogEventLevel ParseLogEventLevel(string value)
594-
{
595-
if (!Enum.TryParse(value, ignoreCase: true, out LogEventLevel parsedLevel))
596-
throw new InvalidOperationException($"The value {value} is not a valid Serilog level.");
597-
return parsedLevel;
598-
}
600+
=> Enum.TryParse(value, ignoreCase: true, out LogEventLevel parsedLevel)
601+
? parsedLevel
602+
: throw new InvalidOperationException($"The value {value} is not a valid Serilog level.");
599603
}

Diff for: src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class StringArgumentValue : IConfigurationArgumentValue
1010
{
1111
readonly string _providedValue;
1212

13-
static readonly Regex StaticMemberAccessorRegex = new Regex("^(?<shortTypeName>[^:]+)::(?<memberName>[A-Za-z][A-Za-z0-9]*)(?<typeNameExtraQualifiers>[^:]*)$");
13+
static readonly Regex StaticMemberAccessorRegex = new("^(?<shortTypeName>[^:]+)::(?<memberName>[A-Za-z][A-Za-z0-9]*)(?<typeNameExtraQualifiers>[^:]*)$");
1414

1515
public StringArgumentValue(string providedValue)
1616
{

Diff for: test/Serilog.Settings.Configuration.Tests/PublishSingleFileTests.cs

+9
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,15 @@ public async Task RunTestApp_ConsoleAndThread(PublishMode publishMode, string st
8888
stdErr.Should().BeEmpty();
8989
}
9090

91+
[Theory]
92+
[ClassData(typeof(PublishModeTheoryData))]
93+
public async Task RunTestApp_ConfigureMinimumLevelOnly(PublishMode publishMode)
94+
{
95+
var (_, stdOut, stdErr) = await RunTestAppAsync(publishMode, "--minimum-level-only");
96+
stdOut.Should().Be("(Main thread) [Information] Expected success");
97+
stdErr.Should().BeEmpty();
98+
}
99+
91100
async Task<(bool IsSingleFile, string StdOut, string StdErr)> RunTestAppAsync(PublishMode publishMode, params string[] args)
92101
{
93102
// Determine whether the app is a _true_ single file, i.e. not a .NET Core 3.x version which

Diff for: test/TestApp/Program.cs

+20-6
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,20 @@
2121
SelfLog.Enable(Console.Error);
2222

2323
Thread.CurrentThread.Name = "Main thread";
24+
const string outputTemplate = "({ThreadName}) [{Level}] {Message}{NewLine}";
2425

25-
var configurationValues = new Dictionary<string, string?>
26+
var configurationValues = new Dictionary<string, string?>();
27+
var minimumLevelOnly = args.Contains("--minimum-level-only");
28+
if (minimumLevelOnly)
2629
{
27-
["Serilog:Enrich:0"] = "WithThreadName",
28-
["Serilog:WriteTo:0:Name"] = "Console",
29-
["Serilog:WriteTo:0:Args:outputTemplate"] = "({ThreadName}) [{Level}] {Message}{NewLine}",
30-
};
30+
configurationValues["Serilog:MinimumLevel"] = "Verbose";
31+
}
32+
else
33+
{
34+
configurationValues["Serilog:Enrich:0"] = "WithThreadName";
35+
configurationValues["Serilog:WriteTo:0:Name"] = "Console";
36+
configurationValues["Serilog:WriteTo:0:Args:outputTemplate"] = outputTemplate;
37+
}
3138

3239
if (args.Contains("--using-thread")) configurationValues["Serilog:Using:Thread"] = "Serilog.Enrichers.Thread";
3340
if (args.Contains("--using-console")) configurationValues["Serilog:Using:Console"] = "Serilog.Sinks.Console";
@@ -40,7 +47,14 @@
4047
{
4148
var configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValues).Build();
4249
var options = assemblies.Count > 0 ? new ConfigurationReaderOptions(assemblies.ToArray()) : null;
43-
var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration, options).CreateLogger();
50+
var loggerConfiguration = new LoggerConfiguration().ReadFrom.Configuration(configuration, options);
51+
if (minimumLevelOnly)
52+
{
53+
loggerConfiguration
54+
.Enrich.WithThreadName()
55+
.WriteTo.Console(outputTemplate: outputTemplate);
56+
}
57+
var logger = loggerConfiguration.CreateLogger();
4458
logger.Information("Expected success");
4559
return 0;
4660
}

0 commit comments

Comments
 (0)