61 lines
1.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|