From 6982c963f655ad807f62467c5bb730ec33f6a4a2 Mon Sep 17 00:00:00 2001 From: Johannes Bickel Date: Thu, 28 Nov 2019 11:46:32 +0100 Subject: [PATCH 1/4] added stringification support --- .../Extensions/Logging/SerilogLogger.cs | 5 +++++ .../SerilogLoggerTests.cs | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs index 007e73d..e88a444 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs @@ -78,6 +78,11 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except if (logger.BindProperty(property.Key.Substring(1), property.Value, true, out var destructured)) properties.Add(destructured); } + else if (property.Key.StartsWith("$")) + { + if (logger.BindProperty(property.Key.Substring(1), property.Value?.ToString() ?? "null", true, out var stringified)) + properties.Add(stringified); + } else { if (logger.BindProperty(property.Key, property.Value, false, out var bound)) diff --git a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs index d2d5bac..e255117 100644 --- a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs +++ b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs @@ -219,6 +219,24 @@ public void CarriesMessageTemplateProperties() Assert.Empty(selfLog.ToString()); } + [Fact] + public void CarriesMessageTemplatePropertiesWhenStringificationIsUsed() + { + var selfLog = new StringWriter(); + SelfLog.Enable(selfLog); + var (logger, sink) = SetUp(LogLevel.Trace); + var array = new[] { 1, 2, 3, 4 }; + + logger.LogInformation("{$array}", array); + + Assert.True(sink.Writes[0].Properties.ContainsKey("array")); + Assert.Equal("\"System.Int32[]\"", sink.Writes[0].Properties["array"].ToString()); + Assert.Equal("{$array}", sink.Writes[0].MessageTemplate.Text); + + SelfLog.Disable(); + Assert.Empty(selfLog.ToString()); + } + [Fact] public void CarriesEventIdIfNonzero() { From b201aba786de99ca6a6f577068a002e2d04f8d44 Mon Sep 17 00:00:00 2001 From: Johannes Bickel Date: Fri, 29 Nov 2019 10:37:32 +0100 Subject: [PATCH 2/4] pass null instead of text "null" --- .../Extensions/Logging/SerilogLogger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs index e88a444..30a46e5 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs @@ -80,7 +80,7 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except } else if (property.Key.StartsWith("$")) { - if (logger.BindProperty(property.Key.Substring(1), property.Value?.ToString() ?? "null", true, out var stringified)) + if (logger.BindProperty(property.Key.Substring(1), property.Value?.ToString(), true, out var stringified)) properties.Add(stringified); } else From 73671f867044aebc18a7fafd99ebe058d44f109d Mon Sep 17 00:00:00 2001 From: Johannes Bickel Date: Thu, 5 Dec 2019 16:58:44 +0100 Subject: [PATCH 3/4] remove $ from key in logger scope to support "force stringify" --- .../Extensions/Logging/SerilogLoggerScope.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs index 045359a..f1abc8e 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs @@ -78,6 +78,11 @@ public void EnrichAndCreateScopeItem(LogEvent logEvent, ILogEventPropertyFactory destructureObject = true; } + if (key.StartsWith("$")) + { + key = key.Substring(1); + } + var property = propertyFactory.CreateProperty(key, stateProperty.Value, destructureObject); logEvent.AddPropertyIfAbsent(property); } From 8428510de3e044615cee399892bfc7c19ee4ed1f Mon Sep 17 00:00:00 2001 From: Johannes Bickel Date: Wed, 11 Dec 2019 07:51:59 +0100 Subject: [PATCH 4/4] fixed stringify support in logger scope --- .../Extensions/Logging/SerilogLoggerScope.cs | 4 +++- .../SerilogLoggerTests.cs | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs index f1abc8e..dd0803c 100644 --- a/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs +++ b/src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLoggerScope.cs @@ -71,6 +71,7 @@ public void EnrichAndCreateScopeItem(LogEvent logEvent, ILogEventPropertyFactory var key = stateProperty.Key; var destructureObject = false; + var value = stateProperty.Value; if (key.StartsWith("@")) { @@ -81,9 +82,10 @@ public void EnrichAndCreateScopeItem(LogEvent logEvent, ILogEventPropertyFactory if (key.StartsWith("$")) { key = key.Substring(1); + value = value?.ToString(); } - var property = propertyFactory.CreateProperty(key, stateProperty.Value, destructureObject); + var property = propertyFactory.CreateProperty(key, value, destructureObject); logEvent.AddPropertyIfAbsent(property); } } diff --git a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs index e255117..5baadf7 100644 --- a/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs +++ b/test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs @@ -162,6 +162,21 @@ public void SingleScopeProperty() Assert.Equal("\"pizza\"", sink.Writes[0].Properties["Name"].ToString()); } + [Fact] + public void StringifyScopeProperty() + { + var (logger, sink) = SetUp(LogLevel.Trace); + + using (logger.BeginScope("{$values}", new int[] { 1, 2, 3, 4 })) + { + logger.Log(LogLevel.Information, 0, TestMessage, null, null); + } + + Assert.Equal(1, sink.Writes.Count); + Assert.True(sink.Writes[0].Properties.ContainsKey("values")); + Assert.Equal("\"System.Int32[]\"", sink.Writes[0].Properties["values"].ToString()); + } + [Fact] public void NestedScopeSameProperty() {