diff --git a/src/Microsoft.Extensions.Logging.Abstractions/Internal/FormattedLogValues.cs b/src/Microsoft.Extensions.Logging.Abstractions/Internal/FormattedLogValues.cs
index e65b7f7f..518759de 100644
--- a/src/Microsoft.Extensions.Logging.Abstractions/Internal/FormattedLogValues.cs
+++ b/src/Microsoft.Extensions.Logging.Abstractions/Internal/FormattedLogValues.cs
@@ -9,11 +9,12 @@
namespace Microsoft.Extensions.Logging.Internal
{
///
- /// LogValues to enable formatting options supported by .
+ /// LogValues to enable formatting options supported by .
/// This also enables using {NamedformatItem} in the format string.
///
public class FormattedLogValues : IReadOnlyList>
{
+ private const string NullFormat = "[null]";
private static ConcurrentDictionary _formatters = new ConcurrentDictionary();
private readonly LogValuesFormatter _formatter;
private readonly object[] _values;
@@ -21,17 +22,12 @@ public class FormattedLogValues : IReadOnlyList>
public FormattedLogValues(string format, params object[] values)
{
- if (format == null)
- {
- throw new ArgumentNullException(nameof(format));
- }
-
- if (values.Length != 0)
+ if (values?.Length != 0 && format != null)
{
_formatter = _formatters.GetOrAdd(format, f => new LogValuesFormatter(f));
}
- _originalMessage = format;
+ _originalMessage = format ?? NullFormat;
_values = values;
}
diff --git a/src/Microsoft.Extensions.Logging.Abstractions/Internal/LogValuesFormatter.cs b/src/Microsoft.Extensions.Logging.Abstractions/Internal/LogValuesFormatter.cs
index 22199d37..22611e54 100644
--- a/src/Microsoft.Extensions.Logging.Abstractions/Internal/LogValuesFormatter.cs
+++ b/src/Microsoft.Extensions.Logging.Abstractions/Internal/LogValuesFormatter.cs
@@ -15,12 +15,11 @@ namespace Microsoft.Extensions.Logging.Internal
///
public class LogValuesFormatter
{
+ private const string NullValue = "(null)";
+ private static readonly object[] EmptyArray = new object[0];
private readonly string _format;
private readonly List _valueNames = new List();
- public string OriginalFormat { get; private set; }
- public List ValueNames => _valueNames;
-
public LogValuesFormatter(string format)
{
OriginalFormat = format;
@@ -60,6 +59,9 @@ public LogValuesFormatter(string format)
_format = sb.ToString();
}
+ public string OriginalFormat { get; private set; }
+ public List ValueNames => _valueNames;
+
private static int FindBraceIndex(string format, char brace, int startIndex, int endIndex)
{
// Example: {{prefix{{{Argument}}}suffix}}.
@@ -124,6 +126,7 @@ public string Format(object[] values)
if (value == null)
{
+ values[i] = NullValue;
continue;
}
@@ -137,12 +140,12 @@ public string Format(object[] values)
var enumerable = value as IEnumerable;
if (enumerable != null)
{
- values[i] = string.Join(", ", enumerable.Cast