[REFACTOR] Refactored logging & added support for Microsoft.Extensions.Logging. Added test WebApi project

This commit is contained in:
max
2024-11-17 22:51:54 +01:00
parent 58739c2aea
commit 737cbcfd11
31 changed files with 398 additions and 97 deletions

View File

@@ -0,0 +1,63 @@
using Microsoft.Extensions.Logging;
namespace DotBased.Logging.MEL;
public class BasedLogger : Microsoft.Extensions.Logging.ILogger
{
public BasedLogger(ILogger logger)
{
basedLogger = logger;
}
private readonly ILogger basedLogger;
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
if (!IsEnabled(logLevel))
return;
var severity = ConvertLogLevelToSeverity(logLevel);
var capsule = ConstructCapsule(severity, eventId, state, exception, formatter);
basedLogger.Log(capsule);
}
private LogCapsule ConstructCapsule<TState>(LogSeverity severity, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
//TODO: Extract parameters & format
if (state is IEnumerable<KeyValuePair<string, object>> stateEnum)
{
foreach (var prop in stateEnum)
{
}
}
return new LogCapsule()
{
Exception = exception,
Message = formatter.Invoke(state, exception),
Parameters = [],
Severity = severity,
TimeStamp = DateTime.Now,
Logger = basedLogger as LoggerBase ?? throw new NullReferenceException(nameof(basedLogger))
};
}
private LogSeverity ConvertLogLevelToSeverity(LogLevel level)
{
return level switch
{
LogLevel.Trace => LogSeverity.Trace,
LogLevel.Debug => LogSeverity.Debug,
LogLevel.Information => LogSeverity.Info,
LogLevel.Warning => LogSeverity.Warning,
LogLevel.Error => LogSeverity.Error,
LogLevel.Critical => LogSeverity.Fatal,
LogLevel.None => LogSeverity.Ignore,
_ => LogSeverity.Verbose
};
}
public bool IsEnabled(LogLevel logLevel) => logLevel != LogLevel.None;
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => default;
}

View File

@@ -0,0 +1,23 @@
using Microsoft.Extensions.Logging;
namespace DotBased.Logging.MEL;
public class BasedLoggerProvider : ILoggerProvider
{
public BasedLoggerProvider(LogOptions options)
{
Options = options;
}
private readonly LogOptions Options;
public Microsoft.Extensions.Logging.ILogger CreateLogger(string categoryName)
{
return new BasedLogger(Options.LoggerBuilder.Invoke(new LoggerInformation(typeof(BasedLoggerProvider)), categoryName));
}
public void Dispose()
{
}
}

View File

@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DotBased\DotBased.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,14 @@
using Microsoft.Extensions.Logging;
namespace DotBased.Logging.MEL;
public static class LoggerBuilderExtensions
{
public static ILoggingBuilder AddDotBased(this ILoggingBuilder builder, LogOptions options)
{
if (builder == null)
throw new ArgumentNullException(nameof(builder));
builder.AddProvider(new BasedLoggerProvider(options));
return builder;
}
}