A Serilog sink wrapper that dispatches events based on a property value.
Install the package from NuGet:
dotnet add package Serilog.Sinks.MapThe WriteTo.Map() method accepts a property name to use as a sink selector, a default value
to use when the property is not attached, and a function that configures the sinks based on each property value.
For example, when using Serilog.Sinks.File:
dotnet add package Serilog.Sinks.FileThe value of a log event property like Name can be inserted into log filenames:
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("Name", "Other", (name, wt) => wt.File($"./logs/log-{name}.txt"))
.CreateLogger();
Log.Information("Hello, {Name}!", "Alice");
// -> Event written to log-Alice.txt
Log.Information("Hello, {Name}!", "Bob");
// -> Event written to log-Bob.txt
Log.Information("Shutting down");
// -> Event written to log-Other.txt
Log.CloseAndFlush();By default, the target sinks opened by this sink won't be closed/disposed until the mapped sink is. This is efficient for dispatching to a finite number of sinks, e.g. file-per-log-level and so-on, but isn't suitable when the set of possible key values is open-ended.
To limit the number of target sinks that will be kept open in the map, specify sinkMapCountLimit:
.WriteTo.Map("Name",
"Other",
(name, wt) => wt.File($"./logs/log-{name}.txt"),
sinkMapCountLimit: 10)To keep no sinks open, i.e. close them immediately after processing each event, a sinkMapCountLimit of zero may be specified.
Serilog.Sinks.Map is built around a mapping function, and as such, isn't able to be configured using XML or JSON configuration.