Skip to content

Commit dd62cab

Browse files
authored
Merge pull request #391 from 0xced/reduce-throw
Throw for missing configured assemblies only when required
2 parents 2c62e41 + e4468ce commit dd62cab

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

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

Lines changed: 7 additions & 1 deletion
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;
@@ -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.

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

Lines changed: 9 additions & 0 deletions
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

test/TestApp/Program.cs

Lines changed: 20 additions & 6 deletions
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)