File: StringLoggerFactory.cs
Web Access
Project: src\src\DataProtection\DataProtection\test\Microsoft.AspNetCore.DataProtection.Tests\Microsoft.AspNetCore.DataProtection.Tests.csproj (Microsoft.AspNetCore.DataProtection.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
using System.Text;
using Microsoft.Extensions.Logging;
 
namespace Microsoft.AspNetCore.DataProtection;
 
internal sealed class StringLoggerFactory : ILoggerFactory
{
    private readonly StringBuilder _log = new StringBuilder();
 
    public StringLoggerFactory(LogLevel logLevel)
    {
        MinimumLevel = logLevel;
    }
 
    public LogLevel MinimumLevel { get; set; }
 
    public void AddProvider(ILoggerProvider provider)
    {
        // no-op
    }
 
    public ILogger CreateLogger(string name)
    {
        return new StringLogger(name, this);
    }
 
    public void Dispose()
    {
    }
 
    public override string ToString()
    {
        return _log.ToString();
    }
 
    private sealed class StringLogger : ILogger
    {
        private readonly StringLoggerFactory _factory;
        private readonly string _name;
 
        public StringLogger(string name, StringLoggerFactory factory)
        {
            _name = name;
            _factory = factory;
        }
 
        public IDisposable BeginScope<TState>(TState state)
        {
            return new DummyDisposable();
        }
 
        public bool IsEnabled(LogLevel logLevel)
        {
            return (logLevel >= _factory.MinimumLevel);
        }
 
        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            string message = string.Format(CultureInfo.InvariantCulture,
                "Provider: {0}" + Environment.NewLine +
                "Log level: {1}" + Environment.NewLine +
                "Event id: {2}" + Environment.NewLine +
                "Exception: {3}" + Environment.NewLine +
                "Message: {4}", _name, logLevel, eventId, exception?.ToString(), formatter(state, exception));
            _factory._log.AppendLine(message);
        }
 
        private sealed class DummyDisposable : IDisposable
        {
            public void Dispose()
            {
                // no-op
            }
        }
    }
}