diff --git a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs index 711b73d5ba4973..44951b8c84c931 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs @@ -66,7 +66,7 @@ public LogValuesFormatter(string format) formatDelimiterIndex = formatDelimiterIndex < 0 ? closeBraceIndex : formatDelimiterIndex + openBraceIndex; vsb.Append(format.AsSpan(scanIndex, openBraceIndex - scanIndex + 1)); - vsb.Append(_valueNames.Count.ToString()); + vsb.Append(_valueNames.Count.ToString(CultureInfo.InvariantCulture)); _valueNames.Add(format.Substring(openBraceIndex + 1, formatDelimiterIndex - openBraceIndex - 1)); vsb.Append(format.AsSpan(formatDelimiterIndex, closeBraceIndex - formatDelimiterIndex + 1)); @@ -270,7 +270,10 @@ private static bool TryFormatArgumentIfNullOrEnumerable(T? value, [NotNullWhe vsb.Append(", "); } - vsb.Append(e != null ? e.ToString() : NullValue); + vsb.Append( + e is IFormattable f ? f.ToString(null, CultureInfo.InvariantCulture) : + e is not null ? e.ToString() : + NullValue); first = false; } stringValue = vsb.ToString(); diff --git a/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerExtensionsTest.cs b/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerExtensionsTest.cs index 3c39d1d359683a..06f24cffb18a73 100644 --- a/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerExtensionsTest.cs +++ b/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerExtensionsTest.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Tests; using Microsoft.Extensions.Logging.Testing; using Xunit; @@ -134,6 +135,28 @@ public void FormatMessage_LogsCorrectValues() Assert.Null(debug.Exception); } + [Fact] + public void FormatMessage_UsesInvariantCulture() + { + // Arrange + using ThreadCultureChange _ = new("fr-FR"); + var sink = new TestSink(); + var logger = SetUp(sink); + + logger.Log(LogLevel.Trace, "{0}", new object[] { 1.23 }); + logger.Log(LogLevel.Information, "{0}", new object[] { new object[] { 1.23f } }); + + Assert.Equal(2, sink.Writes.Count()); + + Assert.True(sink.Writes.TryTake(out var trace)); + Assert.Equal(LogLevel.Trace, trace.LogLevel); + Assert.Equal("1.23", trace.State?.ToString()); + + Assert.True(sink.Writes.TryTake(out var info)); + Assert.Equal(LogLevel.Information, info.LogLevel); + Assert.Equal("1.23", info.State?.ToString()); + } + [Fact] public void MessageAndEventId_LogsCorrectValues() {