Utopia-Canteen-System/Services/Logging/FileLoggerProvider.cs

61 lines
1.8 KiB
C#

using Microsoft.Extensions.Logging;
namespace UtopiaCanteenSystem.Services.Logging;
public sealed class FileLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName) => new FileLoggerAdapter(categoryName);
public void Dispose()
{
}
private sealed class FileLoggerAdapter : ILogger
{
private readonly string _category;
public FileLoggerAdapter(string category) => _category = category;
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => null;
public bool IsEnabled(LogLevel logLevel) => logLevel >= LogLevel.Information;
public void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception? exception,
Func<TState, Exception?, string> formatter)
{
if (!IsEnabled(logLevel))
return;
var message = formatter(state, exception);
var component = ShortCategory(_category);
switch (logLevel)
{
case LogLevel.Critical:
case LogLevel.Error:
FileLogger.Error(component, message, exception);
break;
case LogLevel.Warning:
FileLogger.Warn(component, message, exception);
break;
case LogLevel.Debug:
case LogLevel.Trace:
FileLogger.Debug(component, message);
break;
default:
FileLogger.Info(component, message);
break;
}
}
private static string ShortCategory(string category)
{
var idx = category.LastIndexOf('.');
return idx >= 0 ? category[(idx + 1)..] : category;
}
}
}