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}"; } }