public void GetStandardColumnNameAndValueForPropertiesCallsXmlPropertyFormatterSimplifyForAlsoForAdditionalProperties() { // Arrange const string additionalColumnName = "AdditionalColumn1"; var property1Value = new ScalarValue("1"); var property2Value = new ScalarValue(2); var property3Value = new ScalarValue("Three"); var logEvent = new LogEvent( new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero), LogEventLevel.Debug, null, new MessageTemplate(new List <MessageTemplateToken>() { new TextToken("Test message") }), new List <LogEventProperty> { new LogEventProperty("Property1", property1Value), new LogEventProperty("Property2", property2Value), new LogEventProperty(additionalColumnName, property3Value) }); var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions { AdditionalColumns = new List <SqlColumn> { new SqlColumn { PropertyName = additionalColumnName, DataType = SqlDbType.NVarChar } } }; SetupSut(columnOptions, CultureInfo.InvariantCulture); // Act _sut.GetStandardColumnNameAndValue(StandardColumn.Properties, logEvent); // Assert _xmlPropertyFormatterMock.Verify(x => x.Simplify(property1Value, columnOptions.Properties), Times.Once); _xmlPropertyFormatterMock.Verify(x => x.Simplify(property2Value, columnOptions.Properties), Times.Once); _xmlPropertyFormatterMock.Verify(x => x.Simplify(property3Value, columnOptions.Properties), Times.Once); }
public void WriteEventToCustomStandardColumnsSinkOptionsInterface() { // Arrange var options = new Serilog.Sinks.MSSqlServer.ColumnOptions(); options.Message.ColumnName = "CustomMessage"; options.MessageTemplate.ColumnName = "CustomMessageTemplate"; options.Level.ColumnName = "CustomLevel"; options.TimeStamp.ColumnName = "CustomTimeStamp"; options.Exception.ColumnName = "CustomException"; options.Properties.ColumnName = "CustomProperties"; options.Id.ColumnName = "CustomId"; var loggerConfiguration = new LoggerConfiguration(); Log.Logger = loggerConfiguration.WriteTo.MSSqlServer( connectionString: DatabaseFixture.LogEventsConnectionString, sinkOptions: new SinkOptions { TableName = DatabaseFixture.LogTableName, AutoCreateSqlTable = true }, columnOptions: options) .CreateLogger(); // Act const string loggingInformationMessage = "Logging Information message"; using (var file = File.CreateText("CustomColumnsEvent.Self.log")) { Serilog.Debugging.SelfLog.Enable(TextWriter.Synchronized(file)); Log.Information(loggingInformationMessage); Log.CloseAndFlush(); } // Assert VerifyCustomLogMessageWasWritten(loggingInformationMessage); }
public void GetStandardColumnNameAndValueForLogLevelReturnsLogLevelKeyValueAsEnum() { // Arrange var logLevel = LogEventLevel.Debug; var logEvent = new LogEvent( new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero), logLevel, null, new MessageTemplate(new List <MessageTemplateToken>() { new TextToken("Test message") }), new List <LogEventProperty>()); var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); columnOptions.Level.StoreAsEnum = true; SetupSut(columnOptions); // Act var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Level, logEvent); // Assert Assert.Equal("Level", result.Key); Assert.Equal(logLevel, result.Value); }
public void CustomIdColumnSinkOptionsInterface() { // Arrange var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); var customIdName = "CustomIdName"; columnOptions.Id.ColumnName = customIdName; // Act using (var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, new SinkOptions { TableName = DatabaseFixture.LogTableName, BatchPostingLimit = 1, BatchPeriod = TimeSpan.FromSeconds(1), AutoCreateSqlTable = true }, null, columnOptions, null)) { } // Assert VerifyIdColumnWasCreatedAndHasIdentity(customIdName); }
public void TableCreatedWithDefaultNamesSinkOptionsInterface() { // Arrange var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); var standardNames = new List <string> { "Message", "MessageTemplate", "Level", "TimeStamp", "Exception", "Properties" }; // Act using (var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, new SinkOptions { TableName = DatabaseFixture.LogTableName, BatchPostingLimit = 1, BatchPeriod = TimeSpan.FromSeconds(1), AutoCreateSqlTable = true }, null, columnOptions, null)) { } // Assert VerifyDatabaseColumnsWereCreated(standardNames); }
public void MSSqlServerAuditCallsApplyMicrosoftExtensionsConfigurationGetColumnOptions() { // Arrange var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); var columnOptionsSectionMock = new Mock <IConfigurationSection>(); var auditSinkFactoryMock = new Mock <IMSSqlServerAuditSinkFactory>(); // Act _loggerConfiguration.AuditTo.MSSqlServerInternal( connectionString: "TestConnectionString", sinkOptions: new SinkOptions { TableName = "TestTableName" }, columnOptions: columnOptions, columnOptionsSection: columnOptionsSectionMock.Object, applySystemConfiguration: _applySystemConfigurationMock.Object, applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object, auditSinkFactory: auditSinkFactoryMock.Object); // Assert _applyMicrosoftExtensionsConfigurationMock.Verify(c => c.ConfigureColumnOptions(columnOptions, columnOptionsSectionMock.Object), Times.Once); }
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions() { // arrange var options = new Serilog.Sinks.MSSqlServer.ColumnOptions { TimeStamp = { DataType = SqlDbType.DateTimeOffset, ConvertToUtc = true } }; var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00 SetupTest(options, testDateTimeOffset); // act var columns = traits.GetColumnsAndValues(logEvent); // assert var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName); Assert.IsType <DateTimeOffset>(timeStampColumn.Value); var timeStampColumnOffset = (DateTimeOffset)timeStampColumn.Value; Assert.Equal(testDateTimeOffset.Hour - 1, timeStampColumnOffset.Hour); Assert.Equal(new TimeSpan(0), timeStampColumnOffset.Offset); }
public void LogEventExcludeStandardColumns() { // Arrange var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); columnOptions.Store.Remove(StandardColumn.Properties); columnOptions.Store.Add(StandardColumn.LogEvent); columnOptions.LogEvent.ExcludeStandardColumns = true; Log.Logger = new LoggerConfiguration() .WriteTo.MSSqlServer ( connectionString: DatabaseFixture.LogEventsConnectionString, new SinkOptions { TableName = DatabaseFixture.LogTableName, AutoCreateSqlTable = true, BatchPostingLimit = 1, BatchPeriod = TimeSpan.FromSeconds(10) }, columnOptions: columnOptions ) .CreateLogger(); // Act Log.Logger .ForContext("A", "AValue") .Information("Logging message"); Log.CloseAndFlush(); // Assert VerifyCustomQuery <LogEventColumn>($"SELECT LogEvent from {DatabaseFixture.LogTableName}", e => e.Should().Contain(l => l.LogEvent.Contains("AValue"))); VerifyCustomQuery <LogEventColumn>($"SELECT LogEvent from {DatabaseFixture.LogTableName}", e => e.Should().NotContain(l => l.LogEvent.Contains("TimeStamp"))); }
public void GetSqlFromDataTableCreatesIdAndMessageWithLengthColumnsCorrectly() { // Arrange var dataColumnId = new DataColumn(); var sqlColumnId = new SqlColumn { AllowNull = false, ColumnName = "Id", DataType = SqlDbType.Int }; dataColumnId.ExtendedProperties["SqlColumn"] = sqlColumnId; var dataColumnMessage = new DataColumn(); var sqlColumnMessage = new SqlColumn { AllowNull = false, ColumnName = "Message", DataType = SqlDbType.NVarChar, DataLength = 100 }; dataColumnMessage.ExtendedProperties["SqlColumn"] = sqlColumnMessage; var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions { PrimaryKey = sqlColumnId }; var expectedResult = "CREATE TABLE [TestSchemaName].[TestTableName] ( \r\n" + "[Id] INT NOT NULL,\r\n" + "[Message] NVARCHAR(100) NOT NULL\r\n" + " CONSTRAINT [PK_TestTableName] PRIMARY KEY CLUSTERED ([Id])"; // Act string result; using (var dataTable = new DataTable()) { dataTable.Columns.Add(dataColumnId); dataTable.Columns.Add(dataColumnMessage); result = _sut.GetSqlFromDataTable("TestSchemaName", "TestTableName", dataTable, columnOptions); } // Assert Assert.Contains(expectedResult, result, StringComparison.InvariantCulture); }
public void GetStandardColumnNameAndValueForMessageReturnsSimpleTextMessageKeyValueWithMaxDataLengthDefined() { // Arrange const string messageText = "A long test message"; var logEvent = new LogEvent( new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero), LogEventLevel.Debug, null, new MessageTemplate(new List <MessageTemplateToken>() { new TextToken(messageText) }), new List <LogEventProperty>()); var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions { Message = { DataLength = -1 } }; SetupSut(columnOptions); // Act var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Message, logEvent); // Assert Assert.Equal("Message", result.Key); Assert.Equal(messageText, result.Value); }
public void GetStandardColumnNameAndValueForExceptionReturnsExceptionKeyValue() { // Arrange var exception = new InvalidOperationException("Something went wrong"); var expectedValue = exception.ToString(); var logEvent = new LogEvent( new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero), LogEventLevel.Debug, exception, new MessageTemplate(new List <MessageTemplateToken>() { new TextToken("Test message") }), new List <LogEventProperty>()); var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); columnOptions.Level.StoreAsEnum = true; SetupSut(columnOptions); // Act var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Exception, logEvent); // Assert Assert.Equal("Exception", result.Key); Assert.Equal(expectedValue, result.Value); }
public void ConfigureColumnOptionsSetsPrimaryKeyWhenSettingPrimaryKeyColumnNameToAdditionalColumnCaseInsensitive() { // Arrange var customColumn = new SqlColumn { ColumnName = "TestCustomColumn" }; var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions { PrimaryKey = null, AdditionalColumns = new List <SqlColumn> { customColumn } }; SetupConfigurationSectionMocks(); _configurationSectionMock.Setup(s => s["primaryKeyColumnName"]).Returns("testCustomColumn"); var sut = new MicrosoftExtensionsColumnOptionsProvider(); // Act var result = sut.ConfigureColumnOptions(columnOptions, _configurationSectionMock.Object); // Assert Assert.Equal(customColumn, result.PrimaryKey); }
private void SetupSut( Serilog.Sinks.MSSqlServer.ColumnOptions options, ITextFormatter logEventFormatter = null) { _sut = new StandardColumnDataGenerator(options, null, logEventFormatter); }
public DataTableCreatorTests() { _columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); }