Skip to content

Commit 4842d1b

Browse files
authored
Make sure the JSON has a valid structure.
When setting the excludeAdditionalProperties and excludeStandardColumns configuration properties to true to the logEvent column, it produces an invalid JSON, with an extra comma before the Properties or Rendering property. Example: {, "Properties": {...}}
1 parent 41f65c7 commit 4842d1b

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/JsonLogEventFormatter.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2018 Serilog Contributors
1+
// Copyright 2018 Serilog Contributors
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ namespace Serilog.Sinks.MSSqlServer
2929
internal class JsonLogEventFormatter : ITextFormatter
3030
{
3131
static readonly JsonValueFormatter ValueFormatter = new JsonValueFormatter(typeTagName: null);
32+
private const string COMMA_DELIMITER = ",";
3233

3334
MSSqlServerSinkTraits traits;
3435

@@ -52,6 +53,8 @@ public void Format(LogEvent logEvent, TextWriter output)
5253

5354
output.Write("{");
5455

56+
string precedingDelimiter = "";
57+
5558
if (traits.columnOptions.LogEvent.ExcludeStandardColumns == false)
5659
{
5760
// The XML Properties column has never included the Standard Columns, but prior
@@ -63,7 +66,6 @@ public void Format(LogEvent logEvent, TextWriter output)
6366
// whether Standard Columns are written (specifically, the subset of Standard
6467
// columns that were output by the external JsonFormatter class).
6568

66-
string precedingDelimiter = "";
6769
var store = traits.columnOptions.Store;
6870

6971
WriteIfPresent(StandardColumn.TimeStamp);
@@ -77,7 +79,7 @@ void WriteIfPresent(StandardColumn col)
7779
if(store.Contains(col))
7880
{
7981
output.Write(precedingDelimiter);
80-
precedingDelimiter = ",";
82+
precedingDelimiter = COMMA_DELIMITER;
8183
var colData = traits.GetStandardColumnNameAndValue(col, logEvent);
8284
JsonValueFormatter.WriteQuotedJsonString(colData.Key, output);
8385
output.Write(":");
@@ -88,7 +90,11 @@ void WriteIfPresent(StandardColumn col)
8890
}
8991

9092
if (logEvent.Properties.Count != 0)
93+
{
94+
output.Write(precedingDelimiter);
9195
WriteProperties(logEvent.Properties, output);
96+
precedingDelimiter = COMMA_DELIMITER;
97+
}
9298

9399
var tokensWithFormat = logEvent.MessageTemplate.Tokens
94100
.OfType<PropertyToken>()
@@ -98,6 +104,7 @@ void WriteIfPresent(StandardColumn col)
98104

99105
if (tokensWithFormat.Length != 0)
100106
{
107+
output.Write(precedingDelimiter);
101108
WriteRenderings(tokensWithFormat, logEvent.Properties, output);
102109
}
103110

@@ -106,13 +113,13 @@ void WriteIfPresent(StandardColumn col)
106113

107114
static void WriteProperties(IReadOnlyDictionary<string, LogEventPropertyValue> properties, TextWriter output)
108115
{
109-
output.Write(",\"Properties\":{");
116+
output.Write("\"Properties\":{");
110117

111118
string precedingDelimiter = "";
112119
foreach (var property in properties)
113120
{
114121
output.Write(precedingDelimiter);
115-
precedingDelimiter = ",";
122+
precedingDelimiter = COMMA_DELIMITER;
116123
JsonValueFormatter.WriteQuotedJsonString(property.Key, output);
117124
output.Write(':');
118125
ValueFormatter.Format(property.Value, output);
@@ -123,13 +130,13 @@ static void WriteProperties(IReadOnlyDictionary<string, LogEventPropertyValue> p
123130

124131
static void WriteRenderings(IEnumerable<IGrouping<string, PropertyToken>> tokensWithFormat, IReadOnlyDictionary<string, LogEventPropertyValue> properties, TextWriter output)
125132
{
126-
output.Write(",\"Renderings\":{");
133+
output.Write("\"Renderings\":{");
127134

128135
string precedingDelimiter = "";
129136
foreach (var ptoken in tokensWithFormat)
130137
{
131138
output.Write(precedingDelimiter);
132-
precedingDelimiter = ",";
139+
precedingDelimiter = COMMA_DELIMITER;
133140

134141
JsonValueFormatter.WriteQuotedJsonString(ptoken.Key, output);
135142
output.Write(":[");
@@ -138,7 +145,7 @@ static void WriteRenderings(IEnumerable<IGrouping<string, PropertyToken>> tokens
138145
foreach (var format in ptoken)
139146
{
140147
output.Write(fdelim);
141-
fdelim = ",";
148+
fdelim = COMMA_DELIMITER;
142149

143150
output.Write("{\"Format\":");
144151
JsonValueFormatter.WriteQuotedJsonString(format.Format, output);

0 commit comments

Comments
 (0)