Skip to content

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

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

Add WriteTo.FallbackChain and WriteTo.Fallible support in configuration#474
nblumhardt merged 2 commits intoserilog: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>
Copy link
Copy Markdown
Member

@nblumhardt nblumhardt left a comment

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
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