using System; using System.Threading.Tasks; using FinlyticCore.Models.Settings; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace FinlyticCore.Services; /// /// Bietet kanalbasierte, dynamisch steuerbare Logging-Funktionalitäten über den . /// /// Die aufrufende Klasse (für Log-Kategorien). /// Der DbContext des Services für den Zugriff auf die Settings. public interface IFinlyticLogger where TDbContext : DbContext { // --- Debug --- Task LogDebugAsync(SettingKey channelKey, string message, params object[] args); Task LogDebugAsync(SettingKey channelKey, Exception? exception, string message, params object[] args); // --- Info --- Task LogInfoAsync(SettingKey channelKey, string message, params object[] args); Task LogInfoAsync(SettingKey channelKey, Exception? exception, string message, params object[] args); // --- Warning --- Task LogWarningAsync(SettingKey channelKey, string message, params object[] args); Task LogWarningAsync(SettingKey channelKey, Exception? exception, string message, params object[] args); // --- Error --- Task LogErrorAsync(SettingKey channelKey, string message, params object[] args); Task LogErrorAsync(SettingKey channelKey, Exception? exception, string message, params object[] args); // --- Trace & Critical --- Task LogTraceAsync(SettingKey channelKey, string message, params object[] args); Task LogCriticalAsync(SettingKey channelKey, Exception? exception, string message, params object[] args); } /// /// Kanalbasierte Logger-Implementierung, die Einstellungen und Stummschaltungen /// in Echtzeit aus dem bezieht. /// public class FinlyticLogger : IFinlyticLogger where TDbContext : DbContext { private readonly ILogger _logger; private readonly ISettingsService _settingsService; public FinlyticLogger( ILogger logger, ISettingsService settingsService) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _settingsService = settingsService ?? throw new ArgumentNullException(nameof(settingsService)); } #region Debug public async Task LogDebugAsync(SettingKey channelKey, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Debug)) { _logger.LogDebug(message, args); } } public async Task LogDebugAsync(SettingKey channelKey, Exception? exception, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Debug)) { if (exception != null) _logger.LogDebug(exception, message, args); else _logger.LogDebug(message, args); } } #endregion #region Info public async Task LogInfoAsync(SettingKey channelKey, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Information)) { _logger.LogInformation(message, args); } } public async Task LogInfoAsync(SettingKey channelKey, Exception? exception, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Information)) { if (exception != null) _logger.LogInformation(exception, message, args); else _logger.LogInformation(message, args); } } #endregion #region Warning public async Task LogWarningAsync(SettingKey channelKey, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Warning)) { _logger.LogWarning(message, args); } } public async Task LogWarningAsync(SettingKey channelKey, Exception? exception, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Warning)) { if (exception != null) _logger.LogWarning(exception, message, args); else _logger.LogWarning(message, args); } } #endregion #region Error public async Task LogErrorAsync(SettingKey channelKey, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Error)) { _logger.LogError(message, args); } } public async Task LogErrorAsync(SettingKey channelKey, Exception? exception, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Error)) { if (exception != null) _logger.LogError(exception, message, args); else _logger.LogError(message, args); } } #endregion #region Trace & Critical public async Task LogTraceAsync(SettingKey channelKey, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Trace)) { _logger.LogTrace(message, args); } } public async Task LogCriticalAsync(SettingKey channelKey, Exception? exception, string message, params object[] args) { if (await ShouldLogAsync(channelKey, LogLevel.Critical)) { if (exception != null) _logger.LogCritical(exception, message, args); else _logger.LogCritical(message, args); } } #endregion /// /// Prüft, ob ein spezifischer Kanal und die aufrufende Klasse aktives Logging erlauben. /// private async Task ShouldLogAsync(SettingKey channelKey, LogLevel level) { ArgumentNullException.ThrowIfNull(channelKey); try { return await _settingsService.GetSettingAsync(channelKey); } catch { return channelKey.DefaultValue; } } }