Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7.0.0 Release #343

Merged
merged 100 commits into from
May 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
2598d22
Minimumlevel partial fix with IConfigurationRoot.Providers
Aug 28, 2020
890516c
Added unit tests.
Aug 29, 2020
a14b22d
Add support for delegate values #259
almostchristian Feb 24, 2022
40cdc10
Improved test to demonstrate overload resolution
almostchristian Feb 24, 2022
1cb5b7f
Removed redundant condition
almostchristian Feb 25, 2022
1b8b31a
Improve test to execute method
almostchristian Feb 25, 2022
18053e9
Merge branch 'support-static-delegate-types' of https://github.com/al…
almostchristian Feb 25, 2022
691aefa
Dev version bump [skip ci]
nblumhardt Sep 2, 2022
85e720f
Fix build matrix conditional deployment
nblumhardt Sep 13, 2022
07f0bc4
Backport conditional deployment fix from main [skip ci]
nblumhardt Sep 13, 2022
13be21c
Dev version bump, bringing in new features [skip ci]
nblumhardt Sep 13, 2022
375c5bb
Merge pull request #233 from HexHunter97/minimumlevel-partial-fix
nblumhardt Sep 13, 2022
736aa1a
Merge pull request #301 from almostchristian/support-static-delegate-…
nblumhardt Sep 13, 2022
248749d
Mark partial and invalid JSON code snippets as YAML to avoid GitHub m…
nblumhardt Sep 13, 2022
8f241f8
Merge pull request #326 from nblumhardt/json-examples
skomis-mm Sep 14, 2022
8391832
extensions method discovery workaround for #330
Oct 12, 2022
e171429
Merge pull request #333 from skomis-mm/extMethodDiscoveryFix
skomis-mm Oct 13, 2022
27870cf
case insensitive log level support
Oct 15, 2022
bd0d0a4
Merge pull request #334 from skomis-mm/logLvlCaseInsens
nblumhardt Oct 18, 2022
34d6475
Implicit usings and file-scoped namespaces
sungam3r Dec 19, 2022
99b9ed1
Merge pull request #342 from sungam3r/c10
nblumhardt Dec 19, 2022
e0ca463
Small cleanup
sungam3r Jan 6, 2023
ab87641
Merge pull request #344 from sungam3r/temp
skomis-mm Jan 6, 2023
beefbfe
Drop support for .NET Framework 4.5.1
0xced Feb 17, 2023
1b5feb2
Merge pull request #351 from 0xced/drop-net451
nblumhardt Mar 9, 2023
ab5d7a4
.NET 4.5.1 support dropped
nblumhardt Mar 9, 2023
fbc5e72
Add support for IFormatProvider used to convert string to other types
0xced Feb 11, 2023
0fc8b57
Merge pull request #348 from 0xced/FormatProvider
nblumhardt Mar 10, 2023
65285b1
Use raw string literals
sungam3r Mar 10, 2023
0a29ea3
Merge pull request #354 from sungam3r/raw
SimonCropp Mar 10, 2023
b483da5
Add a callback on the reader options to expose the log level switches
0xced Feb 8, 2023
93c820f
Merge pull request #352 from 0xced/LogLevelSwitches
nblumhardt Mar 11, 2023
5a4eb14
add globaljson
SimonCropp Mar 11, 2023
0931bc7
leverage Directory.Build.props
SimonCropp Mar 11, 2023
01642e6
Merge pull request #355 from serilog/globaljson
SimonCropp Mar 11, 2023
5e72f96
Switch to raw string literal
sungam3r Mar 11, 2023
716934f
Merge pull request #357 from sungam3r/raw2
SimonCropp Mar 11, 2023
5c1651c
Merge pull request #356 from serilog/leverage-Directory.Build.props
SimonCropp Mar 12, 2023
139aa66
build on macos
SimonCropp Mar 12, 2023
e6662a7
Update serilog-settings-configuration.sln.DotSettings
SimonCropp Mar 12, 2023
5a2ade3
update test refs (#359)
SimonCropp Mar 12, 2023
8ebb9e2
Merge branch 'dev' into build-on-macos
SimonCropp Mar 12, 2023
062a760
Update Build.ps1
SimonCropp Mar 12, 2023
85a1680
Update Build.ps1
SimonCropp Mar 12, 2023
6deeec3
redundant project settings (#360)
SimonCropp Mar 12, 2023
cdb8710
Merge branch 'dev' into build-on-macos
SimonCropp Mar 12, 2023
3b2d346
Update Serilog.Settings.Configuration.Tests.csproj
SimonCropp Mar 12, 2023
da62a35
Merge pull request #358 from serilog/build-on-macos
nblumhardt Mar 12, 2023
2d5e1dd
Add API approval test
sungam3r Mar 13, 2023
679ce35
Merge pull request #361 from sungam3r/api
nblumhardt Mar 13, 2023
058cb9d
Allow configuration from contents of Serilog section
sungam3r Mar 13, 2023
8e2d9a9
Allow internal types and methods
sungam3r Mar 13, 2023
8736256
Merge pull request #362 from sungam3r/section
skomis-mm Mar 13, 2023
6aa905a
Enable nullable reference types
0xced Mar 11, 2023
d4fe8aa
Merge pull request #364 from 0xced/nullable-reference-types
nblumhardt Mar 14, 2023
6871947
Fix some nullable reference type issues
0xced Mar 14, 2023
de58300
Merge pull request #365 from 0xced/nullable-reference-types-fixes
nblumhardt Mar 15, 2023
70d8b95
Make all JSON strings valid in tests
0xced Mar 16, 2023
b6fe2cf
Enable JSON language injection
0xced Mar 16, 2023
79ecfe6
Merge pull request #367 from 0xced/valid-json
nblumhardt Mar 16, 2023
ccf4dc8
Improve SelfLog when a configuration method is not found
0xced Mar 16, 2023
d776fdc
Merge branch 'dev' into internal
sungam3r Mar 17, 2023
3849967
fix
sungam3r Mar 17, 2023
264d3be
tests
sungam3r Mar 17, 2023
4ab71a9
Update src/Serilog.Settings.Configuration/Settings/Configuration/Conf…
0xced Mar 17, 2023
5a91b7d
Add more nullable type reference safeties
0xced Mar 17, 2023
3d3261e
Merge pull request #369 from 0xced/nrt-safety
nblumhardt Mar 21, 2023
ae0e57e
Merge pull request #363 from sungam3r/internal
nblumhardt Mar 21, 2023
eae1ded
Merge pull request #368 from 0xced/Better-SelfLogs
nblumhardt Mar 21, 2023
e8b2a39
Make sure that single-file apps can find assemblies that contains sinks
0xced Mar 16, 2023
ecddb13
Add integration tests
0xced Mar 15, 2023
a812ab1
Rename AutoAssemblyFinder into CompositeAssemblyFinder
0xced Mar 16, 2023
9a28018
Add some diagnostics with ITestOutputHelper when running the TestApp exe
0xced Mar 16, 2023
92d37fc
Run tests on the TestApp when published as self-contained
0xced Mar 16, 2023
74402f8
Simplify loading assemblies
0xced Mar 17, 2023
2b6c040
Make tests successfully run concurrently across multiple target frame…
0xced Mar 25, 2023
e71c549
Parallelize tests across target frameworks on AppVeyor
0xced Mar 26, 2023
4828123
Use a nuget.config file instead of specifying multiple sources on the…
0xced Mar 27, 2023
2cb45f5
Refactor the TestApp fixture
0xced Apr 2, 2023
895f83d
Mark integration tests as such with [Trait("Category", "Integration")]
0xced Apr 6, 2023
fb1edbd
Added missing closing bracket on Complex parameter value binding summary
DevAlvaroF Apr 20, 2023
9f8f898
Merge pull request #375 from DevAlvaroF/patch-1
nblumhardt Apr 21, 2023
31451b4
v7.0 - pin to MEC v7, including matching target frameworks
nblumhardt May 3, 2023
6be97a7
Quick README update to note the versioning policy
nblumhardt May 3, 2023
246920e
Merge pull request #377 from nblumhardt/v7
nblumhardt May 4, 2023
ac1b8c8
Merge branch 'dev' into single-app-no-assemblies-exception
nblumhardt May 4, 2023
e87d4e8
Fix bad merge, drop obsolete target
nblumhardt May 5, 2023
325577e
Merge pull request #353 from 0xced/single-app-no-assemblies-exception
nblumhardt May 5, 2023
b98e589
Simplify loading assemblies
0xced May 5, 2023
321156e
Merge pull request #379 from 0xced/simplify-loading-assemblies
nblumhardt May 5, 2023
d22b9fe
Add a callback on the reader options to expose the log filter switches
0xced Mar 15, 2023
7f5c27f
Do not force filter switch names with a leading $ in OnFilterSwitchCr…
0xced May 8, 2023
4ec3365
Fix tests on .NET Framework 4.8
0xced May 8, 2023
26945f1
Merge pull request #366 from 0xced/LogFilterSwitches
skomis-mm May 8, 2023
5b2b456
Merge pull request #380 from 0xced/fix-net48-tests
skomis-mm May 8, 2023
1e370b5
Fix build script
0xced May 5, 2023
74ba30e
Fix tests on .NET Framework 4.8 (really)
0xced May 8, 2023
78214e9
Merge pull request #381 from 0xced/fix-net48-tests
skomis-mm May 8, 2023
0793eba
Merge pull request #378 from 0xced/fix-build-script
nblumhardt May 9, 2023
d7e0dbd
Update README.md references to 4.0 -> 7.0
nblumhardt May 10, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ end_of_line = lf

[*.{cmd, bat}]
end_of_line = crlf

csharp_style_namespace_declarations = file_scoped:suggestion
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
Expand Down Expand Up @@ -200,7 +200,4 @@ FakesAssemblies/

project.lock.json

#Test files
*.txt

artifacts/
58 changes: 18 additions & 40 deletions Build.ps1
Original file line number Diff line number Diff line change
@@ -1,60 +1,38 @@
echo "build: Build started"
Write-Output "build: Build started"

Push-Location $PSScriptRoot

if(Test-Path .\artifacts) {
echo "build: Cleaning .\artifacts"
Remove-Item .\artifacts -Force -Recurse
Write-Output "build: Cleaning .\artifacts"
Remove-Item .\artifacts -Force -Recurse
}

& dotnet restore --no-cache

$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$env:APPVEYOR_REPO_BRANCH -ne $NULL];
$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL];
$suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)))-$revision"}[$branch -eq "main" -and $revision -ne "local"]
$commitHash = $(git rev-parse --short HEAD)
$buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""]

echo "build: Package version suffix is $suffix"
echo "build: Build version suffix is $buildSuffix"

foreach ($src in gci src/*) {
Push-Location $src

echo "build: Packaging project in $src"

& dotnet build -c Release --version-suffix=$buildSuffix

if($suffix) {
& dotnet pack -c Release --include-source --no-build -o ../../artifacts --version-suffix=$suffix -p:ContinuousIntegrationBuild=true
} else {
& dotnet pack -c Release --include-source --no-build -o ../../artifacts -p:ContinuousIntegrationBuild=true
}
if($LASTEXITCODE -ne 0) { exit 1 }
Write-Output "build: Package version suffix is $suffix"
Write-Output "build: Build version suffix is $buildSuffix"

Pop-Location
}

foreach ($test in gci test/*.Tests) {
Push-Location $test

echo "build: Testing project in $test"
& dotnet build --configuration Release --version-suffix=$buildSuffix /p:ContinuousIntegrationBuild=true

& dotnet test -c Release
if($LASTEXITCODE -ne 0) { exit 3 }
if($LASTEXITCODE -ne 0) { throw 'build failed' }

Pop-Location
if($suffix) {
& dotnet pack src\Serilog.Settings.Configuration --configuration Release --no-build --no-restore -o artifacts --version-suffix=$suffix
} else {
& dotnet pack src\Serilog.Settings.Configuration --configuration Release --no-build --no-restore -o artifacts
}

foreach ($test in gci test/*.PerformanceTests) {
Push-Location $test
if($LASTEXITCODE -ne 0) { throw 'pack failed' }

echo "build: Building performance test project in $test"
Write-Output "build: Testing"

& dotnet build -c Release
if($LASTEXITCODE -ne 0) { exit 2 }

Pop-Location
}
# Dotnet test doesn't run separate TargetFrameworks in parallel: https://github.com/dotnet/sdk/issues/19147
# Workaround: use `dotnet test` on dlls directly in order to pass the `--parallel` option to vstest.
# The _reported_ runtime is wrong but the _actual_ used runtime is correct, see https://github.com/microsoft/vstest/issues/2037#issuecomment-720549173
& dotnet test test\Serilog.Settings.Configuration.Tests\bin\Release\*\Serilog.Settings.Configuration.Tests.dll --parallel

Pop-Location
if($LASTEXITCODE -ne 0) { throw 'unit tests failed' }
10 changes: 5 additions & 5 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
<PropertyGroup>
<LangVersion>latest</LangVersion>
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<TreatSpecificWarningsAsErrors />
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)assets/Serilog.snk</AssemblyOriginatorKeyFile>
<ImplicitUsings>enable</ImplicitUsings>
<CheckEolTargetFramework>false</CheckEolTargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.2" PrivateAssets="all" />
</ItemGroup>
</Project>
77 changes: 60 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ For a more sophisticated example go to the [sample](sample/Sample) folder.

Root section name can be changed:

```json
```yaml
{
"CustomSection": {
...
Expand All @@ -65,16 +65,17 @@ Root section name can be changed:
```

```csharp
var options = new ConfigurationReaderOptions { SectionName = "CustomSection" };
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration, sectionName: "CustomSection")
.ReadFrom.Configuration(configuration, options)
.CreateLogger();
```

### Using section and auto-discovery of configuration assemblies

`Using` section contains list of **assemblies** in which configuration methods (`WriteTo.File()`, `Enrich.WithThreadId()`) reside.

```json
```yaml
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Enrichers.Thread", /* ... */ ],
// ...
Expand All @@ -83,7 +84,7 @@ var logger = new LoggerConfiguration()

For .NET Core projects build tools produce `.deps.json` files and this package implements a convention using `Microsoft.Extensions.DependencyModel` to find any package among dependencies with `Serilog` anywhere in the name and pulls configuration methods from it, so the `Using` section in example above can be omitted:

```json
```yaml
{
"Serilog": {
"MinimumLevel": "Debug",
Expand All @@ -106,8 +107,9 @@ In case of [non-standard](#azure-functions-v2-v3) dependency management you can
```csharp
var functionDependencyContext = DependencyContext.Load(typeof(Startup).Assembly);

var options = new ConfigurationReaderOptions(functionDependencyContext) { SectionName = "AzureFunctionsJobHost:Serilog" };
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(hostConfig, sectionName: "AzureFunctionsJobHost:Serilog", dependencyContext: functionDependencyContext)
.ReadFrom.Configuration(hostConfig, options)
.CreateLogger();
```

Expand All @@ -119,8 +121,9 @@ var configurationAssemblies = new[]
typeof(ConsoleLoggerConfigurationExtensions).Assembly,
typeof(FileLoggerConfigurationExtensions).Assembly,
};
var options = new ConfigurationReaderOptions(configurationAssemblies);
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration, configurationAssemblies)
.ReadFrom.Configuration(configuration, options)
.CreateLogger();
```

Expand Down Expand Up @@ -183,6 +186,22 @@ You can also declare `LoggingLevelSwitch`-es in custom section and reference the

Level updates to switches are also respected for a dynamic update.

Since version 7.0.0, both declared switches (i.e. `Serilog:LevelSwitches` section) and minimum level override switches (i.e. `Serilog:MinimumLevel:Override` section) are exposed through a callback on the reader options so that a reference can be kept:

```csharp
var allSwitches = new Dictionary<string, LoggingLevelSwitch>();
var options = new ConfigurationReaderOptions
{
OnLevelSwitchCreated = (switchName, levelSwitch) => allSwitches[switchName] = levelSwitch
};

var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration, options)
.CreateLogger();

LoggingLevelSwitch controlSwitch = allSwitches["$controlSwitch"];
```

### WriteTo, Enrich, AuditTo, Destructure sections

These sections support simplified syntax, for example the following is valid if no arguments are needed by the sinks:
Expand All @@ -195,7 +214,7 @@ Or alternatively, the long-form (`"Name":` ...) syntax from the example above ca

By `Microsoft.Extensions.Configuration.Json` convention, array syntax implicitly defines index for each element in order to make unique paths for configuration keys. So the example above is equivalent to:

```json
```yaml
"WriteTo": {
"0": "Console",
"1": "DiagnosticTrace"
Expand All @@ -204,7 +223,7 @@ By `Microsoft.Extensions.Configuration.Json` convention, array syntax implicitly

And

```json
```yaml
"WriteTo:0": "Console",
"WriteTo:1": "DiagnosticTrace"
```
Expand All @@ -213,7 +232,7 @@ And

When overriding settings with [environment variables](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#environment-variables) it becomes less convenient and fragile, so you can specify custom names:

```json
```yaml
"WriteTo": {
"ConsoleSink": "Console",
"DiagnosticTraceSink": { "Name": "DiagnosticTrace" }
Expand All @@ -226,9 +245,9 @@ This section defines a static list of key-value pairs that will enrich log event

### Filter section

This section defines filters that will be applied to log events. It is especially usefull in combination with _[Serilog.Expressions](https://github.com/serilog/serilog-expressions)_ (or legacy _[Serilog.Filters.Expressions](https://github.com/serilog/serilog-filters-expressions)_) package so you can write expression in text form:
This section defines filters that will be applied to log events. It is especially useful in combination with _[Serilog.Expressions](https://github.com/serilog/serilog-expressions)_ (or legacy _[Serilog.Filters.Expressions](https://github.com/serilog/serilog-filters-expressions)_) package so you can write expression in text form:

```json
```yaml
"Filter": [{
"Name": "ByIncludingOnly",
"Args": {
Expand All @@ -239,7 +258,7 @@ This section defines filters that will be applied to log events. It is especiall

Using this package you can also declare `LoggingFilterSwitch`-es in custom section and reference them for filter parameters:

```json
```yaml
{
"Serilog": {
"FilterSwitches": { "filterSwitch": "Application = 'Sample'" },
Expand All @@ -256,11 +275,27 @@ Using this package you can also declare `LoggingFilterSwitch`-es in custom secti

Level updates to switches are also respected for a dynamic update.

Since version 7.0.0, filter switches are exposed through a callback on the reader options so that a reference can be kept:

```csharp
var filterSwitches = new Dictionary<string, ILoggingFilterSwitch>();
var options = new ConfigurationReaderOptions
{
OnFilterSwitchCreated = (switchName, filterSwitch) => filterSwitches[switchName] = filterSwitch
};

var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration, options)
.CreateLogger();

ILoggingFilterSwitch filterSwitch = filterSwitches["filterSwitch"];
```

### Nested configuration sections

Some Serilog packages require a reference to a logger configuration object. The sample program in this project illustrates this with the following entry configuring the _[Serilog.Sinks.Async](https://github.com/serilog/serilog-sinks-async)_ package to wrap the _[Serilog.Sinks.File](https://github.com/serilog/serilog-sinks-file)_ package. The `configure` parameter references the File sink configuration:

```json
```yaml
"WriteTo:Async": {
"Name": "Async",
"Args": {
Expand All @@ -282,11 +317,13 @@ Some Serilog packages require a reference to a logger configuration object. The

When the configuration specifies a discrete value for a parameter (such as a string literal), the package will attempt to convert that value to the target method's declared CLR type of the parameter. Additional explicit handling is provided for parsing strings to `Uri`, `TimeSpan`, `enum`, arrays and custom collections.

Since version 7.0.0, conversion will use the invariant culture (`CultureInfo.InvariantCulture`) as long as the `ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions options)` method is used. Obsolete methods use the current culture to preserve backward compatibility.

### Static member support

Static member access can be used for passing to the configuration argument via [special](https://github.com/serilog/serilog-settings-configuration/blob/dev/test/Serilog.Settings.Configuration.Tests/StringArgumentValueTests.cs#L35) syntax:

```json
```yaml
{
"Args": {
"encoding": "System.Text.Encoding::UTF8",
Expand All @@ -299,14 +336,15 @@ Static member access can be used for passing to the configuration argument via [

If the parameter value is not a discrete value, it will try to find a best matching public constructor for the argument:

```json
```yaml
{
"Name": "Console",
"Args": {
"formatter": {
// `type` (or $type) is optional, must be specified for abstract declared parameter types
"type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
"template": "[{@t:HH:mm:ss} {@l:u3} {Coalesce(SourceContext, '<none>')}] {@m}\n{@x}"
}
}
}
```
Expand All @@ -317,7 +355,7 @@ For other cases the package will use the configuration binding system provided b

If parameter type is an interface or an abstract class you need to specify the full type name that implements abstract type. The implementation type should have parameterless constructor.

```json
```yaml
"Destructure": [
{ "Name": "With", "Args": { "policy": "Sample.CustomPolicy, Sample" } },
...
Expand Down Expand Up @@ -377,8 +415,9 @@ public class Startup : FunctionsStartup
var functionDependencyContext = DependencyContext.Load(typeof(Startup).Assembly);

var hostConfig = sp.GetRequiredService<IConfiguration>();
var options = new ConfigurationReaderOptions(functionDependencyContext) { SectionName = "AzureFunctionsJobHost:Serilog" };
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(hostConfig, sectionName: "AzureFunctionsJobHost:Serilog", dependencyContext: functionDependencyContext)
.ReadFrom.Configuration(hostConfig, options)
.CreateLogger();

return new SerilogLoggerProvider(logger, dispose: true);
Expand All @@ -405,3 +444,7 @@ In order to make auto-discovery of configuration assemblies work, modify Functio

</Project>
```

### Versioning

This package tracks the versioning and target framework support of its [_Microsoft.Extensions.Configuration_](https://nuget.org/packages/Microsoft.Extensions.Configuration) dependency.