Beispiel #1
0
        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);
        }
Beispiel #8
0
        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")));
        }
Beispiel #9
0
        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);
        }
Beispiel #12
0
        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);
 }
Beispiel #14
0
 public DataTableCreatorTests()
 {
     _columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
 }