datalust/serilog-sinks-seq

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:

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.

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