Accept an `IFormatProvider`
taspeotis opened this issue · 3 comments
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 👍
There are a few moving parts to this; Seq uses Serilog.Formatting.Compact.CompactJsonFormatter
to format its payloads:
CompactJsonFormatter
renders any message template tokens that have formats associated with them:
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.
7.x and later support this.
Sorry I mistook this for ITextFormatter
, which is now supported; I'm not sure if it's enough to apply the custom format provider (but may be, I'll look into it).