Skip to content

Commit e1336eb

Browse files
committed
Back out message pre-rendering
1 parent 0fdc163 commit e1336eb

File tree

4 files changed

+30
-268
lines changed

4 files changed

+30
-268
lines changed

src/Serilog.Sinks.Seq/Sinks/Seq/Formatting/CleanMessageTemplateFormatter.cs

-146
This file was deleted.

src/Serilog.Sinks.Seq/Sinks/Seq/Formatting/Padding.cs

-54
This file was deleted.

src/Serilog.Sinks.Seq/Sinks/Seq/SeqCompactJsonFormatter.cs

+20-35
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
using Serilog.Formatting.Json;
2323
using Serilog.Parsing;
2424
using Serilog.Sinks.Seq.Conventions;
25-
using Serilog.Sinks.Seq.Formatting;
26-
2725
// ReSharper disable MemberCanBePrivate.Global
2826
// ReSharper disable PossibleMultipleEnumeration
2927

@@ -39,17 +37,16 @@ public class SeqCompactJsonFormatter: ITextFormatter
3937
readonly IDottedPropertyNameConvention _dottedPropertyNameConvention;
4038
readonly JsonValueFormatter _valueFormatter;
4139
readonly IFormatProvider _formatProvider;
42-
readonly bool _renderMessages;
4340

44-
/// <summary>Construct a <see cref="SeqCompactJsonFormatter"/>.</summary>
41+
/// <summary>
42+
/// Construct a <see cref="SeqCompactJsonFormatter"/>.
43+
/// </summary>
4544
/// <param name="valueFormatter">A value formatter for <see cref="LogEventPropertyValue"/>s on the event.</param>
4645
/// <param name="formatProvider">An <see cref="IFormatProvider"/> that will be used to render log event tokens.</param>
4746
public SeqCompactJsonFormatter(IFormatProvider? formatProvider = null, JsonValueFormatter? valueFormatter = null)
4847
{
4948
var acceptDottedPropertyNames = AppContext.TryGetSwitch("Serilog.Parsing.MessageTemplateParser.AcceptDottedPropertyNames", out var accept) && accept;
5049

51-
_renderMessages = acceptDottedPropertyNames || formatProvider != null && !ReferenceEquals(formatProvider, CultureInfo.InvariantCulture);
52-
5350
_dottedPropertyNameConvention = acceptDottedPropertyNames ?
5451
new UnflattenDottedPropertyNames() :
5552
new PreserveDottedPropertyNames();
@@ -85,38 +82,26 @@ public void FormatEvent(LogEvent logEvent, TextWriter output)
8582
output.Write("\",\"@mt\":");
8683
JsonValueFormatter.WriteQuotedJsonString(logEvent.MessageTemplate.Text, output);
8784

88-
if (_renderMessages)
89-
{
90-
// `@m` is normally created during ingestion, however, it must be sent from the client
91-
// to honour non-default IFormatProviders
92-
output.Write(",\"@m\":");
93-
JsonValueFormatter.WriteQuotedJsonString(
94-
CleanMessageTemplateFormatter.Format(logEvent.MessageTemplate, logEvent.Properties, _formatProvider),
95-
output);
96-
}
97-
else
98-
{
99-
var tokensWithFormat = logEvent.MessageTemplate.Tokens
100-
.OfType<PropertyToken>()
101-
.Where(pt => pt.Format != null);
85+
var tokensWithFormat = logEvent.MessageTemplate.Tokens
86+
.OfType<PropertyToken>()
87+
.Where(pt => pt.Format != null);
10288

103-
// Better not to allocate an array in the 99.9% of cases where this is false
104-
// ReSharper disable once PossibleMultipleEnumeration
105-
if (tokensWithFormat.Any())
89+
// Better not to allocate an array in the 99.9% of cases where this is false
90+
// ReSharper disable once PossibleMultipleEnumeration
91+
if (tokensWithFormat.Any())
92+
{
93+
output.Write(",\"@r\":[");
94+
var delim = "";
95+
foreach (var r in tokensWithFormat)
10696
{
107-
output.Write(",\"@r\":[");
108-
var delim = "";
109-
foreach (var r in tokensWithFormat)
110-
{
111-
output.Write(delim);
112-
delim = ",";
113-
var space = new StringWriter();
114-
r.Render(logEvent.Properties, space, _formatProvider);
115-
JsonValueFormatter.WriteQuotedJsonString(space.ToString(), output);
116-
}
117-
118-
output.Write(']');
97+
output.Write(delim);
98+
delim = ",";
99+
var space = new StringWriter();
100+
r.Render(logEvent.Properties, space, _formatProvider);
101+
JsonValueFormatter.WriteQuotedJsonString(space.ToString(), output);
119102
}
103+
104+
output.Write(']');
120105
}
121106

122107
if (logEvent.Level != LogEventLevel.Information)

test/Serilog.Sinks.Seq.Tests/SeqCompactJsonFormatterTests.cs

+10-33
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
using System.Diagnostics;
66
using System.Globalization;
77
using System.IO;
8-
using System.Linq;
98
using Newtonsoft.Json;
109
using Newtonsoft.Json.Linq;
1110
using Serilog.Events;
12-
using Serilog.Parsing;
1311
using Xunit;
1412
// ReSharper disable AccessToDisposedClosure
1513
// ReSharper disable ParameterOnlyUsedForPreconditionCheck.Local
@@ -18,7 +16,7 @@ namespace Serilog.Sinks.Seq.Tests;
1816

1917
public class SeqCompactJsonFormatterTests
2018
{
21-
JObject AssertValidJson(Action<ILogger> act, IFormatProvider? formatProvider = null, Action<JObject>? assert = null)
19+
static JObject AssertValidJson(Action<ILogger> act, IFormatProvider? formatProvider = null, Action<JObject>? assert = null)
2220
{
2321
var sw = new StringWriter();
2422
var logger = new LoggerConfiguration()
@@ -48,40 +46,21 @@ public void PropertiesFormatCorrectlyForTheFormatProvider(string cultureName)
4846
{
4947
var cultureInfo = new CultureInfo(cultureName);
5048

51-
var number = Math.PI * 10000;
49+
const double number = Math.PI * 10000;
5250
var date = new DateTime(2024, 7, 19, 10, 00, 59);
53-
var currency = 12345.67M;
51+
const decimal currency = 12345.67M;
5452

55-
// Culture-specific formatting differs by .NET version (and possibly OS).
56-
var messageBuilder = new StringWriter(cultureInfo);
57-
messageBuilder.Write("{0:n} {1} {2:C}", number, date, currency);
58-
var expectedMessage = messageBuilder.ToString();
53+
// Culture-specific formatting differs by .NET version platform.
54+
var expectedNumber = number.ToString("n", cultureInfo);
55+
var expectedCurrency = currency.ToString("C", cultureInfo);
5956

6057
AssertValidJson(log => log.Information("{a:n} {b} {c:C}", number, date, currency), cultureInfo, evt =>
6158
{
62-
Assert.Equal(expectedMessage, evt["@m"]!.Value<string>());
63-
Assert.Null(evt["@r"]);
59+
Assert.Equal(expectedNumber, evt["@r"]![0]!.Value<string>());
60+
Assert.Equal(expectedCurrency, evt["@r"]![1]!.Value<string>());
6461
});
6562
}
66-
67-
[Fact]
68-
public void MessageNotRenderedForDefaultFormatProvider()
69-
{
70-
AssertValidJson(log => log.Information("{a}", 1.234), null, evt =>
71-
{
72-
Assert.Null(evt["@m"]);
73-
});
74-
}
75-
76-
[Fact]
77-
public void MessageNotRenderedForExplicitInvariantCulture()
78-
{
79-
AssertValidJson(log => log.Information("{a}", 1.234), CultureInfo.InvariantCulture, evt =>
80-
{
81-
Assert.Null(evt["@m"]);
82-
});
83-
}
84-
63+
8564
[Fact]
8665
public void AnEmptyEventIsValidJson()
8766
{
@@ -150,9 +129,7 @@ public void TraceAndSpanIdsGenerateValidJson()
150129
{
151130
var traceId = ActivityTraceId.CreateRandom();
152131
var spanId = ActivitySpanId.CreateRandom();
153-
var evt = new LogEvent(DateTimeOffset.Now, LogEventLevel.Information, null,
154-
new MessageTemplate(Enumerable.Empty<MessageTemplateToken>()), Enumerable.Empty<LogEventProperty>(),
155-
traceId, spanId);
132+
var evt = new LogEvent(DateTimeOffset.Now, LogEventLevel.Information, null, MessageTemplate.Empty, [], traceId, spanId);
156133
var json = AssertValidJson(log => log.Write(evt));
157134
Assert.Equal(traceId.ToHexString(), json["@tr"]);
158135
Assert.Equal(spanId.ToHexString(), json["@sp"]);

0 commit comments

Comments
 (0)