| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | using System;using System.Globalization;using Microsoft.Extensions.Logging;using Microsoft.Extensions.Logging.Abstractions;namespace Jellyfin.Server.ServerSetupApp;/// <inheritdoc/>public class StartupLogger : IStartupLogger{    private readonly StartupLogTopic? _topic;    /// <summary>    /// Initializes a new instance of the <see cref="StartupLogger"/> class.    /// </summary>    /// <param name="logger">The underlying base logger.</param>    public StartupLogger(ILogger logger)    {        BaseLogger = logger;    }    /// <summary>    /// Initializes a new instance of the <see cref="StartupLogger"/> class.    /// </summary>    /// <param name="logger">The underlying base logger.</param>    /// <param name="topic">The group for this logger.</param>    internal StartupLogger(ILogger logger, StartupLogTopic? topic) : this(logger)    {        _topic = topic;    }    internal static IStartupLogger Logger { get; set; } = new StartupLogger(NullLogger.Instance);    /// <inheritdoc/>    public StartupLogTopic? Topic => _topic;    /// <summary>    /// Gets or Sets the underlying base logger.    /// </summary>    protected ILogger BaseLogger { get; set; }    /// <inheritdoc/>    public IStartupLogger BeginGroup(FormattableString logEntry)    {        return new StartupLogger(BaseLogger, AddToTopic(logEntry));    }    /// <inheritdoc/>    public IStartupLogger With(ILogger logger)    {        return new StartupLogger(logger, Topic);    }    /// <inheritdoc/>    public IStartupLogger<TCategory> With<TCategory>(ILogger logger)    {        return new StartupLogger<TCategory>(logger, Topic);    }    /// <inheritdoc/>    public IStartupLogger<TCategory> BeginGroup<TCategory>(FormattableString logEntry)    {        return new StartupLogger<TCategory>(BaseLogger, AddToTopic(logEntry));    }    private StartupLogTopic AddToTopic(FormattableString logEntry)    {        var startupEntry = new StartupLogTopic()        {            Content = logEntry.ToString(CultureInfo.InvariantCulture),            DateOfCreation = DateTimeOffset.Now        };        if (Topic is null)        {            SetupServer.LogQueue?.Enqueue(startupEntry);        }        else        {            Topic.Children.Add(startupEntry);        }        return startupEntry;    }    /// <inheritdoc/>    public IDisposable? BeginScope<TState>(TState state)        where TState : notnull    {        return null;    }    /// <inheritdoc/>    public bool IsEnabled(LogLevel logLevel)    {        return true;    }    /// <inheritdoc/>    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)    {        if (BaseLogger.IsEnabled(logLevel))        {            // if enabled allow the base logger also to receive the message            BaseLogger.Log(logLevel, eventId, state, exception, formatter);        }        var startupEntry = new StartupLogTopic()        {            LogLevel = logLevel,            Content = formatter(state, exception),            DateOfCreation = DateTimeOffset.Now        };        if (Topic is null)        {            SetupServer.LogQueue?.Enqueue(startupEntry);        }        else        {            Topic.Children.Add(startupEntry);        }    }}
 |