serilog-sinks-seq
serilog-sinks-seq copied to clipboard
Accept an `IFormatProvider`
I'd like to render a currency value in my log output. For the sake of discussion:
decimal currentBalance = 12345.67M;
Log.Logger.Information("Your balance is {CurrentBalance:C}", currentBalance);
As best I can tell Seq uses the invariant culture which renders currencies like ¤12,345.67
(or (¤12,345.67)
for negative). I sympathise with the choice of invariant culture as a good default but its currency format is not very native to me.
Serilog's documentation suggests the onus is on sinks to support format providers, and I can't see any way to give Seq a CustomDecimalFormatter
or similar.
For now I am using {CurrentBalance:$#,0.00}
as a workaround, I'd prefer to use C
and get a en-AU/en-US style currency.
If I've overlooked how to specify a format provider for this sink please let me know, otherwise I submit "Specify Format Provider" as a feature request for your consideration.
Thanks for the suggestion, Todd - makes perfect sense :+1:
There are a few moving parts to this; Seq uses Serilog.Formatting.Compact.CompactJsonFormatter
to format its payloads:
https://github.com/serilog/serilog-sinks-seq/blob/3152e1d59fbbbc07ea97f3f3cba3e48914659a8b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs#L40
CompactJsonFormatter
renders any message template tokens that have formats associated with them:
https://github.com/serilog/serilog-formatting-compact/blob/dev/src/Serilog.Formatting.Compact/Formatting/Compact/CompactJsonFormatter.cs#L84
But unfortunately, it doesn't supply the third IFormatProvider
parameter to PropertyToken.Render()
.
Right now the quickest option will probably be for us to take over the formatting responsibility here in the Seq sink, and accept an IFormatProvider
through WriteTo.Seq()
, but I suspect longer-term we'll need to consider some changes in Serilog.Formatting.Compact to accommodate this.