Skip to content

Commit d683fd6

Browse files
authored
Merge pull request #654 from serilog-mssql/dev
* Fixed issue #643: TraceId and SpanId are saved as empty string instead of NULL (thanks to @nanny07)
2 parents d704800 + 4efe0b1 commit d683fd6

File tree

4 files changed

+111
-4
lines changed

4 files changed

+111
-4
lines changed

CHANGES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 9.0.2
2+
* Fixed issue #643: TraceId and SpanId are saved as empty string instead of NULL (thanks to @nanny07)
3+
14
# 9.0.1
25
* Fixed issue #642: NuGet package downgrade System.Configuration.ConfigurationManager error
36
* Updated sample apps to .NET 9

src/Serilog.Sinks.MSSqlServer/Serilog.Sinks.MSSqlServer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Description>A Serilog sink that writes events to Microsoft SQL Server and Azure SQL</Description>
5-
<VersionPrefix>9.0.1</VersionPrefix>
5+
<VersionPrefix>9.0.2</VersionPrefix>
66
<EnablePackageValidation>true</EnablePackageValidation>
77
<PackageValidationBaselineVersion>9.0.0</PackageValidationBaselineVersion>
88
<Authors>Michiel van Oudheusden;Christian Kadluba;Serilog Contributors</Authors>

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,16 @@ public KeyValuePair<string, object> GetStandardColumnNameAndValue(StandardColumn
5151
case StandardColumn.Level:
5252
return new KeyValuePair<string, object>(_columnOptions.Level.ColumnName, _columnOptions.Level.StoreAsEnum ? (object)logEvent.Level : logEvent.Level.ToString());
5353
case StandardColumn.TraceId:
54-
return new KeyValuePair<string, object>(_columnOptions.TraceId.ColumnName, logEvent.TraceId.ToString());
54+
var useDefaultTraceIdValue = logEvent.TraceId is null && !_columnOptions.TraceId.AllowNull;
55+
return new KeyValuePair<string, object>(_columnOptions.TraceId.ColumnName, useDefaultTraceIdValue ? _columnOptions.TraceId.AsDataColumn().DefaultValue.ToString() : logEvent.TraceId?.ToString());
5556
case StandardColumn.SpanId:
56-
return new KeyValuePair<string, object>(_columnOptions.SpanId.ColumnName, logEvent.SpanId.ToString());
57+
var useDefaultSpanIdValue = logEvent.SpanId is null && !_columnOptions.SpanId.AllowNull;
58+
return new KeyValuePair<string, object>(_columnOptions.SpanId.ColumnName, useDefaultSpanIdValue ? _columnOptions.SpanId.AsDataColumn().DefaultValue.ToString() : logEvent.SpanId?.ToString());
5759
case StandardColumn.TimeStamp:
5860
return GetTimeStampStandardColumnNameAndValue(logEvent);
5961
case StandardColumn.Exception:
60-
return new KeyValuePair<string, object>(_columnOptions.Exception.ColumnName, logEvent.Exception?.ToString().TruncateOutput(_columnOptions.Exception.DataLength));
62+
var useDefaultExceptionValue = logEvent.Exception is null && !_columnOptions.Exception.AllowNull;
63+
return new KeyValuePair<string, object>(_columnOptions.Exception.ColumnName, useDefaultExceptionValue ? _columnOptions.Exception.AsDataColumn().DefaultValue.ToString() : logEvent.Exception?.ToString().TruncateOutput(_columnOptions.Exception.DataLength));
6164
case StandardColumn.Properties:
6265
return new KeyValuePair<string, object>(_columnOptions.Properties.ColumnName, ConvertPropertiesToXmlStructure(logEvent.Properties));
6366
case StandardColumn.LogEvent:

test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,46 @@ public void GetStandardColumnNameAndValueForTraceIdReturnsLogLevelKeyValue()
282282
Assert.Equal("34898a9020e0390190b0982370034f00", result.Value);
283283
}
284284

285+
[Fact]
286+
public void GetStandardColumnNameAndNullValueForTraceIdReturnsLogLevelKeyValue()
287+
{
288+
// Arrange
289+
var traceId = default(ActivityTraceId);
290+
var logEvent = new LogEvent(
291+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
292+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
293+
new List<LogEventProperty>(), traceId, ActivitySpanId.CreateRandom());
294+
SetupSut(new MSSqlServer.ColumnOptions(), CultureInfo.InvariantCulture);
295+
296+
// Act
297+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.TraceId, logEvent);
298+
299+
// Assert
300+
Assert.Equal("TraceId", result.Key);
301+
Assert.Null(result.Value);
302+
}
303+
304+
[Fact]
305+
public void GetStandardColumnNameAndNullValueForTraceIdWithoutAllowNullReturnsLogLevelKeyValueEmpty()
306+
{
307+
// Arrange
308+
var traceId = default(ActivityTraceId);
309+
var logEvent = new LogEvent(
310+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
311+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
312+
new List<LogEventProperty>(), traceId, ActivitySpanId.CreateRandom());
313+
var columnOptions = new MSSqlServer.ColumnOptions();
314+
columnOptions.TraceId.AllowNull = false;
315+
SetupSut(columnOptions, CultureInfo.InvariantCulture);
316+
317+
// Act
318+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.TraceId, logEvent);
319+
320+
// Assert
321+
Assert.Equal("TraceId", result.Key);
322+
Assert.Equal(string.Empty, result.Value);
323+
}
324+
285325
[Fact]
286326
public void GetStandardColumnNameAndValueForSpanIdReturnsLogLevelKeyValue()
287327
{
@@ -301,6 +341,46 @@ public void GetStandardColumnNameAndValueForSpanIdReturnsLogLevelKeyValue()
301341
Assert.Equal("0390190b09823700", result.Value);
302342
}
303343

344+
[Fact]
345+
public void GetStandardColumnNameAndNullValueForSpanIdReturnsLogLevelKeyValue()
346+
{
347+
// Arrange
348+
var spanId = default(ActivitySpanId);
349+
var logEvent = new LogEvent(
350+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
351+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
352+
new List<LogEventProperty>(), ActivityTraceId.CreateRandom(), spanId);
353+
SetupSut(new MSSqlServer.ColumnOptions(), CultureInfo.InvariantCulture);
354+
355+
// Act
356+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.SpanId, logEvent);
357+
358+
// Assert
359+
Assert.Equal("SpanId", result.Key);
360+
Assert.Null(result.Value);
361+
}
362+
363+
[Fact]
364+
public void GetStandardColumnNameAndNullValueForSpanIdWithoutAllowNullReturnsLogLevelKeyValueEmpty()
365+
{
366+
// Arrange
367+
var spanId = default(ActivitySpanId);
368+
var logEvent = new LogEvent(
369+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
370+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
371+
new List<LogEventProperty>(), ActivityTraceId.CreateRandom(), spanId);
372+
var columnOptions = new MSSqlServer.ColumnOptions();
373+
columnOptions.SpanId.AllowNull = false;
374+
SetupSut(columnOptions, CultureInfo.InvariantCulture);
375+
376+
// Act
377+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.SpanId, logEvent);
378+
379+
// Assert
380+
Assert.Equal("SpanId", result.Key);
381+
Assert.Equal(string.Empty, result.Value);
382+
}
383+
304384
[Fact]
305385
public void GetStandardColumnNameAndValueForLogLevelReturnsLogLevelKeyValueAsEnum()
306386
{
@@ -449,6 +529,27 @@ public void GetStandardColumnNameAndValueForExceptionWhenCalledWithoutExceptionR
449529
Assert.Null(result.Value);
450530
}
451531

532+
[Fact]
533+
public void GetStandardColumnNameAndValueForExceptionWhenCalledWithoutExceptionAndNotAllowedNullReturnsEmptyValue()
534+
{
535+
// Arrange
536+
var logEvent = new LogEvent(
537+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
538+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
539+
new List<LogEventProperty>());
540+
var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
541+
columnOptions.Level.StoreAsEnum = true;
542+
columnOptions.Exception.AllowNull = false;
543+
SetupSut(columnOptions, CultureInfo.InvariantCulture);
544+
545+
// Act
546+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Exception, logEvent);
547+
548+
// Assert
549+
Assert.Equal("Exception", result.Key);
550+
Assert.Equal(string.Empty, result.Value);
551+
}
552+
452553
[Fact]
453554
public void GetStandardColumnNameAndValueForPropertiesUsesRootElementName()
454555
{

0 commit comments

Comments
 (0)