diff --git a/src/Sentry/Internal/DefaultSentryStructuredLogger.cs b/src/Sentry/Internal/DefaultSentryStructuredLogger.cs index 1f13191ed2..e1b7cd4679 100644 --- a/src/Sentry/Internal/DefaultSentryStructuredLogger.cs +++ b/src/Sentry/Internal/DefaultSentryStructuredLogger.cs @@ -29,15 +29,18 @@ private protected override void CaptureLog(SentryLogLevel level, string template var timestamp = _clock.GetUtcNow(); SentryLog.GetTraceIdAndSpanId(_hub, out var traceId, out var spanId); - string message; - try - { - message = string.Format(CultureInfo.InvariantCulture, template, parameters ?? []); - } - catch (FormatException e) + string message = template; + if (parameters is { Length: > 0 }) { - _options.DiagnosticLogger?.LogError(e, "Template string does not match the provided argument. The Log will be dropped."); - return; + try + { + message = string.Format(CultureInfo.InvariantCulture, template, parameters); + } + catch (FormatException e) + { + _options.DiagnosticLogger?.LogError(e, "Template string does not match the provided argument. The Log will be dropped."); + return; + } } ImmutableArray> @params = default; diff --git a/test/Sentry.Tests/SentryStructuredLoggerTests.Format.cs b/test/Sentry.Tests/SentryStructuredLoggerTests.Format.cs index 87894fed75..0a7936c3b3 100644 --- a/test/Sentry.Tests/SentryStructuredLoggerTests.Format.cs +++ b/test/Sentry.Tests/SentryStructuredLoggerTests.Format.cs @@ -83,6 +83,33 @@ public void Log_ConfigureLog_Disabled_DoesNotCaptureEnvelope(SentryLogLevel leve _fixture.Hub.Received(0).CaptureEnvelope(Arg.Any()); } + + [Theory] + [InlineData(SentryLogLevel.Trace)] + [InlineData(SentryLogLevel.Debug)] + [InlineData(SentryLogLevel.Info)] + [InlineData(SentryLogLevel.Warning)] + [InlineData(SentryLogLevel.Error)] + [InlineData(SentryLogLevel.Fatal)] + public void Log_WithoutParameters_DoesNotAttachTemplateAttribute(SentryLogLevel level) + { + _fixture.Options.Experimental.EnableLogs = true; + var logger = _fixture.GetSut(); + + Envelope envelope = null!; + _fixture.Hub.CaptureEnvelope(Arg.Do(arg => envelope = arg)); + + logger.Log(level, "Message Text"); + logger.Flush(); + + _fixture.Hub.Received(1).CaptureEnvelope(Arg.Any()); + var log = envelope.ShouldContainSingleLog(); + + log.Level.Should().Be(level); + log.Message.Should().Be("Message Text"); + log.Template.Should().BeNull(); + log.Parameters.Should().BeEmpty(); + } } file static class SentryStructuredLoggerExtensions diff --git a/test/Sentry.Tests/SentryStructuredLoggerTests.cs b/test/Sentry.Tests/SentryStructuredLoggerTests.cs index bee10461ff..d22edf483e 100644 --- a/test/Sentry.Tests/SentryStructuredLoggerTests.cs +++ b/test/Sentry.Tests/SentryStructuredLoggerTests.cs @@ -301,4 +301,14 @@ public static void AssertLog(this SentryStructuredLoggerTests.Fixture fixture, S { return new KeyValuePair(name, value); } + + public static SentryLog ShouldContainSingleLog(this Envelope envelope) + { + var envelopeItem = envelope.Items.Should().ContainSingle().Which; + var serializable = envelopeItem.Payload.Should().BeOfType().Which; + var log = serializable.Source.Should().BeOfType().Which; + + log.Items.Length.Should().Be(1); + return log.Items[0]; + } }