Skip to content

Add WriteTo.FallbackChain and WriteTo.Fallible support in configuration#474

Merged
nblumhardt merged 2 commits into
serilog:devfrom
ArieGato:feature/fallback-chain-configuration
Apr 30, 2026
Merged

Add WriteTo.FallbackChain and WriteTo.Fallible support in configuration#474
nblumhardt merged 2 commits into
serilog:devfrom
ArieGato:feature/fallback-chain-configuration

Conversation

@ArieGato

Copy link
Copy Markdown
Contributor

Closes #473.

Summary

  • Add FallbackChain and Fallible surrogates to SurrogateConfigurationMethods so the two LoggerSinkConfiguration instance methods introduced in Serilog 4.1 can be used from appsettings.json / IConfiguration.
  • Extend the Sample project with an AlwaysFailingSink plus a SampleFailureListener so both sections in the sample appsettings.json exercise the fallback path and failure-listener path at runtime.
  • Add three configuration-level tests covering: primary → fallback routing, subsequent fallbacks via params array, and Fallible routing failures to a listener.

Implementation notes

Both methods are instance methods on LoggerSinkConfiguration rather than extension methods, so the extension-method scanner in ConfigurationReader.FindConfigurationExtensionMethods doesn't discover them — same as the existing Sink / Logger surrogates.

FallbackChain's third parameter is params Action<LoggerSinkConfiguration>[]. Because params does not set ParameterInfo.HasDefaultValue = true, it isn't treated as omittable by HasImplicitValueWhenNotSpecified, so the surrogate uses = null explicitly. Same underlying mechanical issue as #441; that broader fix would let the surrogate drop the ?? [] workaround later.

LoggerAuditSinkConfiguration does not expose these methods in Serilog (by design — audit pipelines are meant to fail loudly), so no corresponding AuditTo surrogates are added.

Test plan

  • dotnet build passes on net462 / netstandard2.0 / net8.0 / net9.0 / net10.0
  • Full test suite: 325 tests on net8/net10, 326 on net9, 0 failures
  • Coverage on the two new surrogate methods: 100% line, 100% branch (measured with coverlet.collector locally)
  • Sample runs end-to-end and the fallback/failure-listener paths are visibly exercised ([fallback ...] lines in console and [SampleFailureListener] lines in SelfLog)

FallbackChain and Fallible were introduced as instance methods on
LoggerSinkConfiguration in Serilog 4.1, so they weren't discovered by
the extension-method scanner. Expose them through the same surrogate
pattern already used for Sink/Logger.

Sample project demonstrates both features against an AlwaysFailingSink
so the fallback path and failure listener are actually exercised at
runtime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mention Conditional/FallbackChain/Fallible in the nested-configuration
section of the README, and extend the sample appsettings.json with
WithComputed, ByExcluding, ExpressionTemplate, AuditTo, and a
MinimumLevel ControlledBy switch to exercise more of the supported
surface.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

@nblumhardt nblumhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks @ArieGato.

@nblumhardt nblumhardt merged commit d08b415 into serilog:dev Apr 30, 2026
1 check passed
@nblumhardt nblumhardt mentioned this pull request Apr 30, 2026
This was referenced Jun 15, 2026
SonnyRR pushed a commit to SonnyRR/stacked-deck-templates that referenced this pull request Jun 15, 2026
Updated
[Serilog.Settings.Configuration](https://github.com/serilog/serilog-settings-configuration)
from 10.0.0 to 10.0.1.

<details>
<summary>Release notes</summary>

_Sourced from [Serilog.Settings.Configuration's
releases](https://github.com/serilog/serilog-settings-configuration/releases)._

## 10.0.1

## What's Changed
* Support LevelAlias names in configuration parsing by @​mohammed-saalim
in serilog/serilog-settings-configuration#465
* Fix: Update ConditionalSink expression syntax in sample app by
@​gyurebalint in
serilog/serilog-settings-configuration#470
* issue-468: Fix empty/whitespace string converting to array type by
@​gyurebalint-CID in
serilog/serilog-settings-configuration#469
* Add WriteTo.FallbackChain and WriteTo.Fallible support in
configuration by @​ArieGato in
serilog/serilog-settings-configuration#474
* Fix/issue 441 by @​gyurebalint in
serilog/serilog-settings-configuration#471
* Support C# 13 params collections (IEnumerable<T>, List<T>) by
@​gyurebalint in
serilog/serilog-settings-configuration#478

## New Contributors
* @​mohammed-saalim made their first contribution in
serilog/serilog-settings-configuration#465
* @​gyurebalint made their first contribution in
serilog/serilog-settings-configuration#470
* @​gyurebalint-CID made their first contribution in
serilog/serilog-settings-configuration#469
* @​ArieGato made their first contribution in
serilog/serilog-settings-configuration#474

**Full Changelog**:
serilog/serilog-settings-configuration@v10.0.0...v10.0.1

Commits viewable in [compare
view](serilog/serilog-settings-configuration@v10.0.0...v10.0.1).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Serilog.Settings.Configuration&package-manager=nuget&previous-version=10.0.0&new-version=10.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Jun 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support WriteTo.FallbackChain and WriteTo.Fallible from configuration

2 participants