StartupLogger.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System;
  2. using System.Globalization;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Logging.Abstractions;
  5. namespace Jellyfin.Server.ServerSetupApp;
  6. /// <inheritdoc/>
  7. public class StartupLogger : IStartupLogger
  8. {
  9. private readonly StartupLogTopic? _topic;
  10. /// <summary>
  11. /// Initializes a new instance of the <see cref="StartupLogger"/> class.
  12. /// </summary>
  13. /// <param name="logger">The underlying base logger.</param>
  14. public StartupLogger(ILogger logger)
  15. {
  16. BaseLogger = logger;
  17. }
  18. /// <summary>
  19. /// Initializes a new instance of the <see cref="StartupLogger"/> class.
  20. /// </summary>
  21. /// <param name="logger">The underlying base logger.</param>
  22. /// <param name="topic">The group for this logger.</param>
  23. internal StartupLogger(ILogger logger, StartupLogTopic? topic) : this(logger)
  24. {
  25. _topic = topic;
  26. }
  27. internal static IStartupLogger Logger { get; set; } = new StartupLogger(NullLogger.Instance);
  28. /// <inheritdoc/>
  29. public StartupLogTopic? Topic => _topic;
  30. /// <summary>
  31. /// Gets or Sets the underlying base logger.
  32. /// </summary>
  33. protected ILogger BaseLogger { get; set; }
  34. /// <inheritdoc/>
  35. public IStartupLogger BeginGroup(FormattableString logEntry)
  36. {
  37. return new StartupLogger(BaseLogger, AddToTopic(logEntry));
  38. }
  39. /// <inheritdoc/>
  40. public IStartupLogger With(ILogger logger)
  41. {
  42. return new StartupLogger(logger, Topic);
  43. }
  44. /// <inheritdoc/>
  45. public IStartupLogger<TCategory> With<TCategory>(ILogger logger)
  46. {
  47. return new StartupLogger<TCategory>(logger, Topic);
  48. }
  49. /// <inheritdoc/>
  50. public IStartupLogger<TCategory> BeginGroup<TCategory>(FormattableString logEntry)
  51. {
  52. return new StartupLogger<TCategory>(BaseLogger, AddToTopic(logEntry));
  53. }
  54. private StartupLogTopic AddToTopic(FormattableString logEntry)
  55. {
  56. var startupEntry = new StartupLogTopic()
  57. {
  58. Content = logEntry.ToString(CultureInfo.InvariantCulture),
  59. DateOfCreation = DateTimeOffset.Now
  60. };
  61. if (Topic is null)
  62. {
  63. SetupServer.LogQueue?.Enqueue(startupEntry);
  64. }
  65. else
  66. {
  67. Topic.Children.Add(startupEntry);
  68. }
  69. return startupEntry;
  70. }
  71. /// <inheritdoc/>
  72. public IDisposable? BeginScope<TState>(TState state)
  73. where TState : notnull
  74. {
  75. return null;
  76. }
  77. /// <inheritdoc/>
  78. public bool IsEnabled(LogLevel logLevel)
  79. {
  80. return true;
  81. }
  82. /// <inheritdoc/>
  83. public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
  84. {
  85. if (BaseLogger.IsEnabled(logLevel))
  86. {
  87. // if enabled allow the base logger also to receive the message
  88. BaseLogger.Log(logLevel, eventId, state, exception, formatter);
  89. }
  90. var startupEntry = new StartupLogTopic()
  91. {
  92. LogLevel = logLevel,
  93. Content = formatter(state, exception),
  94. DateOfCreation = DateTimeOffset.Now
  95. };
  96. if (Topic is null)
  97. {
  98. SetupServer.LogQueue?.Enqueue(startupEntry);
  99. }
  100. else
  101. {
  102. Topic.Children.Add(startupEntry);
  103. }
  104. }
  105. }