namespace Divergic.Logging.Xunit
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Microsoft.Extensions.Logging;
///
/// The
/// class provides the default formatting of log messages for xUnit test output.
///
public class DefaultFormatter : ILogFormatter
{
private readonly LoggingConfig _config;
///
/// Initializes a new instance of the class.
///
/// The logging configuration.
/// The value is null.
public DefaultFormatter(LoggingConfig config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
}
///
public virtual string Format(
int scopeLevel,
string categoryName,
LogLevel logLevel,
EventId eventId,
string message,
Exception? exception)
{
var padding = new string(' ', scopeLevel * _config.ScopePaddingSpaces);
var parts = new List(2);
if (string.IsNullOrWhiteSpace(message) == false)
{
var part = string.Format(CultureInfo.InvariantCulture, FormatMask, padding, logLevel, eventId.Id,
message);
part = MaskSensitiveValues(part);
parts.Add(part);
}
if (exception != null)
{
var part = string.Format(
CultureInfo.InvariantCulture,
FormatMask,
padding,
logLevel,
eventId.Id,
exception);
part = MaskSensitiveValues(part);
parts.Add(part);
}
return string.Join(Environment.NewLine, parts);
}
private string MaskSensitiveValues(string value)
{
const string mask = "****";
for (var index = 0; index < _config.SensitiveValues.Count; index++)
{
var sensitiveValue = _config.SensitiveValues[index];
value = value.Replace(sensitiveValue, mask);
}
return value;
}
///
/// Returns the string format mask used to generate a log message.
///
/// The format values are:
///
/// - 0: Padding
/// - 1: Level
/// - 2: Event Id
/// - 3: Message
///
///
protected virtual string FormatMask { get; } = "{0}{1} [{2}]: {3}";
}
}