diff --git a/src/libraries/Microsoft.Extensions.Logging.TraceSource/src/TraceSourceLogger.cs b/src/libraries/Microsoft.Extensions.Logging.TraceSource/src/TraceSourceLogger.cs index 1c2f2a970a28e4..e3e81d42cf976d 100644 --- a/src/libraries/Microsoft.Extensions.Logging.TraceSource/src/TraceSourceLogger.cs +++ b/src/libraries/Microsoft.Extensions.Logging.TraceSource/src/TraceSourceLogger.cs @@ -22,22 +22,24 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except { return; } + string message = string.Empty; + if (formatter != null) { message = formatter(state, exception); } - else + else if (state != null) + { + message += state; + } + + if (exception != null) { - if (state != null) - { - message += state; - } - if (exception != null) - { - message += Environment.NewLine + exception; - } + string exceptionDelimiter = string.IsNullOrEmpty(message) ? string.Empty : " " ; + message += exceptionDelimiter + exception; } + if (!string.IsNullOrEmpty(message)) { _traceSource.TraceEvent(GetEventType(logLevel), eventId.Id, message); diff --git a/src/libraries/Microsoft.Extensions.Logging/tests/Common/TraceSourceLoggerTest.cs b/src/libraries/Microsoft.Extensions.Logging/tests/Common/TraceSourceLoggerTest.cs index fbabd024136a46..52632e471466cc 100644 --- a/src/libraries/Microsoft.Extensions.Logging/tests/Common/TraceSourceLoggerTest.cs +++ b/src/libraries/Microsoft.Extensions.Logging/tests/Common/TraceSourceLoggerTest.cs @@ -1,7 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Diagnostics; +using Moq; + using Xunit; namespace Microsoft.Extensions.Logging.Test @@ -45,7 +48,6 @@ public static void MultipleLoggers_IsEnabledReturnsCorrectValue(SourceLevels fir secondSwitch.Level = second; // Act - var factory = TestLoggerBuilder.Create(builder => builder .AddTraceSource(firstSwitch) .AddTraceSource(secondSwitch)); @@ -55,6 +57,33 @@ public static void MultipleLoggers_IsEnabledReturnsCorrectValue(SourceLevels fir // Assert Assert.Equal(expected, logger.IsEnabled(LogLevel.Information)); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public static void Log_Shoud_Add_Exception_To_Message_Whether_Formatter_Is_Null_Or_Not(bool shouldFormatterBeNull) + { + // Arrange + Mock traceListener = new Mock(); + SourceSwitch sourceSwitch = new SourceSwitch("TestSwitch") {Level = SourceLevels.All}; + + ILoggerFactory factory = TestLoggerBuilder.Create(builder => builder.AddTraceSource(sourceSwitch, traceListener.Object)); + ILogger logger = factory.CreateLogger("Test"); + + const LogLevel logLevel = LogLevel.Information; + EventId eventId = new EventId(1); + const string message = "some log message"; + Exception exception = new Exception("Some error occurred"); + Func formatter = shouldFormatterBeNull ? (Func)null : (value, passedException) => value; + + string expectedMessage = $"{message} {exception}"; + + // Act + logger.Log(logLevel, eventId, message, exception, formatter); + + // Assert + traceListener.Verify(listener => listener.TraceEvent(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), expectedMessage), Times.Once); + } } }