Skip to content

Commit

Permalink
Merge pull request #391 from 0xced/reduce-throw
Browse files Browse the repository at this point in the history
Throw for missing configured assemblies only when required
  • Loading branch information
skomis-mm authored Aug 5, 2023
2 parents 2c62e41 + e4468ce commit dd62cab
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ class ConfigurationReader : IConfigurationReader
{
const string LevelSwitchNameRegex = @"^\${0,1}[A-Za-z]+[A-Za-z0-9]*$";

// Section names that can be handled by Serilog itself (hence builtin) without requiring any additional assemblies.
static readonly string[] BuiltinSectionNames = { "LevelSwitches", "MinimumLevel", "Properties" };

readonly IConfiguration _section;
readonly IReadOnlyCollection<Assembly> _configurationAssemblies;
readonly ResolutionContext _resolutionContext;
Expand Down Expand Up @@ -383,7 +386,10 @@ static IReadOnlyCollection<Assembly> LoadConfigurationAssemblies(IConfiguration
assemblies.Add(assumed);
}

if (assemblies.Count == 1)
// We don't want to throw if the configuration contains only sections that can be handled by Serilog itself, without requiring any additional assembly.
// See https://github.com/serilog/serilog-settings-configuration/issues/389
var requiresAdditionalAssemblies = section.GetChildren().Select(e => e.Key).Except(BuiltinSectionNames).Any();
if (assemblies.Count == 1 && requiresAdditionalAssemblies)
{
var message = $"""
No {usingSection.Path} configuration section is defined and no Serilog assemblies were found.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,15 @@ public async Task RunTestApp_ConsoleAndThread(PublishMode publishMode, string st
stdErr.Should().BeEmpty();
}

[Theory]
[ClassData(typeof(PublishModeTheoryData))]
public async Task RunTestApp_ConfigureMinimumLevelOnly(PublishMode publishMode)
{
var (_, stdOut, stdErr) = await RunTestAppAsync(publishMode, "--minimum-level-only");
stdOut.Should().Be("(Main thread) [Information] Expected success");
stdErr.Should().BeEmpty();
}

async Task<(bool IsSingleFile, string StdOut, string StdErr)> RunTestAppAsync(PublishMode publishMode, params string[] args)
{
// Determine whether the app is a _true_ single file, i.e. not a .NET Core 3.x version which
Expand Down
26 changes: 20 additions & 6 deletions test/TestApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,20 @@
SelfLog.Enable(Console.Error);

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

var configurationValues = new Dictionary<string, string?>
var configurationValues = new Dictionary<string, string?>();
var minimumLevelOnly = args.Contains("--minimum-level-only");
if (minimumLevelOnly)
{
["Serilog:Enrich:0"] = "WithThreadName",
["Serilog:WriteTo:0:Name"] = "Console",
["Serilog:WriteTo:0:Args:outputTemplate"] = "({ThreadName}) [{Level}] {Message}{NewLine}",
};
configurationValues["Serilog:MinimumLevel"] = "Verbose";
}
else
{
configurationValues["Serilog:Enrich:0"] = "WithThreadName";
configurationValues["Serilog:WriteTo:0:Name"] = "Console";
configurationValues["Serilog:WriteTo:0:Args:outputTemplate"] = outputTemplate;
}

if (args.Contains("--using-thread")) configurationValues["Serilog:Using:Thread"] = "Serilog.Enrichers.Thread";
if (args.Contains("--using-console")) configurationValues["Serilog:Using:Console"] = "Serilog.Sinks.Console";
Expand All @@ -40,7 +47,14 @@
{
var configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValues).Build();
var options = assemblies.Count > 0 ? new ConfigurationReaderOptions(assemblies.ToArray()) : null;
var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration, options).CreateLogger();
var loggerConfiguration = new LoggerConfiguration().ReadFrom.Configuration(configuration, options);
if (minimumLevelOnly)
{
loggerConfiguration
.Enrich.WithThreadName()
.WriteTo.Console(outputTemplate: outputTemplate);
}
var logger = loggerConfiguration.CreateLogger();
logger.Information("Expected success");
return 0;
}
Expand Down

0 comments on commit dd62cab

Please sign in to comment.