Skip to content

Commit f33b6f8

Browse files
committed
Fixed issue #458
* Fixed exception in AdditionalColumnDataGenerator when passing null as log property value. * Added regression tests.
1 parent 6e93ec4 commit f33b6f8

File tree

3 files changed

+79
-4
lines changed

3 files changed

+79
-4
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ public KeyValuePair<string, object> GetAdditionalColumnNameAndValue(SqlColumn ad
2828
: _columnHierarchicalPropertyValueResolver.GetPropertyValueForColumn(additionalColumn, properties);
2929

3030
var columnName = additionalColumn.ColumnName;
31-
if (property.Value == null)
31+
if (!(property.Value is ScalarValue scalarValue))
3232
{
33-
return new KeyValuePair<string, object>(columnName, DBNull.Value);
33+
return new KeyValuePair<string, object>(columnName, property.Value.ToString());
3434
}
3535

36-
if (!(property.Value is ScalarValue scalarValue))
36+
if (scalarValue.Value == null && additionalColumn.AllowNull)
3737
{
38-
return new KeyValuePair<string, object>(columnName, property.Value.ToString());
38+
return new KeyValuePair<string, object>(columnName, DBNull.Value);
3939
}
4040

4141
var columnType = additionalColumn.AsDataColumn().DataType;

test/Serilog.Sinks.MSSqlServer.Tests/Misc/AdditionalPropertiesTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,58 @@ public void WritesLogEventWithColumnNamedProperties()
6767
VerifyIntegerColumnWritten(additionalColumnName2, property2Value);
6868
}
6969

70+
[Trait("Bugfix", "#458")]
71+
[Fact]
72+
public void WritesLogEventWithNullValueForNullableColumn()
73+
{
74+
// Arrange
75+
const string additionalColumnName1 = "AdditionalColumn1";
76+
const string additionalColumnName2 = "AdditionalColumn2";
77+
var columnOptions = new MSSqlServer.ColumnOptions
78+
{
79+
AdditionalColumns = new List<SqlColumn>
80+
{
81+
new SqlColumn
82+
{
83+
ColumnName = additionalColumnName1,
84+
DataType = SqlDbType.NVarChar,
85+
AllowNull = true,
86+
DataLength = 100
87+
},
88+
new SqlColumn
89+
{
90+
ColumnName = additionalColumnName2,
91+
DataType = SqlDbType.Int,
92+
AllowNull = true
93+
}
94+
}
95+
};
96+
97+
var messageTemplate = $"Hello {{{additionalColumnName1}}} from thread {{{additionalColumnName2}}}";
98+
var property1Value = "PropertyValue1";
99+
var expectedMessage = $"Hello \"{property1Value}\" from thread null";
100+
101+
// Act
102+
Log.Logger = new LoggerConfiguration()
103+
.WriteTo.MSSqlServer(
104+
DatabaseFixture.LogEventsConnectionString,
105+
sinkOptions: new MSSqlServerSinkOptions
106+
{
107+
TableName = DatabaseFixture.LogTableName,
108+
AutoCreateSqlTable = true
109+
},
110+
columnOptions: columnOptions,
111+
formatProvider: CultureInfo.InvariantCulture)
112+
.CreateLogger();
113+
Log.Information(messageTemplate, property1Value, null);
114+
Log.CloseAndFlush();
115+
116+
// Assert
117+
VerifyDatabaseColumnsWereCreated(columnOptions.AdditionalColumns);
118+
VerifyLogMessageWasWritten(expectedMessage);
119+
VerifyStringColumnWritten(additionalColumnName1, property1Value);
120+
}
121+
70122
[Fact]
71123
public void WritesLogEventWithCustomNamedProperties()
72124
{

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,5 +157,28 @@ public void GetAdditionalColumnNameAndValueConvertsUniqueIdentifier()
157157
var expectedResult = Guid.Parse(propertyValue);
158158
Assert.Equal(expectedResult, result.Value);
159159
}
160+
161+
[Trait("Bugfix", "#458")]
162+
[Fact]
163+
public void GetAdditionalColumnNameAndValueConvertsNullValueForNullable()
164+
{
165+
// Arrange
166+
const string columnName = "AdditionalProperty1";
167+
int? propertyValue = null;
168+
var additionalColumn = new SqlColumn(columnName, SqlDbType.Int, true);
169+
var properties = new Dictionary<string, LogEventPropertyValue>();
170+
_columnSimplePropertyValueResolver.Setup(r => r.GetPropertyValueForColumn(
171+
It.IsAny<SqlColumn>(), It.IsAny<IReadOnlyDictionary<string, LogEventPropertyValue>>()))
172+
.Returns(new KeyValuePair<string, LogEventPropertyValue>(columnName, new ScalarValue(propertyValue)));
173+
174+
// Act
175+
var result = _sut.GetAdditionalColumnNameAndValue(additionalColumn, properties);
176+
177+
// Assert
178+
_columnSimplePropertyValueResolver.Verify(r => r.GetPropertyValueForColumn(additionalColumn, properties), Times.Once);
179+
Assert.Equal(columnName, result.Key);
180+
Assert.IsType<DBNull>(result.Value);
181+
Assert.Equal(DBNull.Value, result.Value);
182+
}
160183
}
161184
}

0 commit comments

Comments
 (0)