using Microsoft.Extensions.Logging; using Avalonia.Logging; public sealed class AvaloniaLogSink : ILogSink { private readonly ILoggerFactory _loggerFactory; private readonly Dictionary _areaLoggers = new(); public AvaloniaLogSink(ILoggerFactory loggerFactory) { _loggerFactory = loggerFactory; } public bool IsEnabled(LogEventLevel level, string area) => true; public void Log(LogEventLevel level, string area, object? source, string messageTemplate, params object?[] propertyValues) { if (!_areaLoggers.ContainsKey(area)) _areaLoggers.Add(area, _loggerFactory.CreateLogger($"Avalonia.{area}")); var logger = _areaLoggers[area]; var logLevel = ConvertLogLevel(level); logger.Log(logLevel, messageTemplate, propertyValues); } public void Log(LogEventLevel level, string area, object? source, string messageTemplate) { if (!_areaLoggers.ContainsKey(area)) _areaLoggers.Add(area, _loggerFactory.CreateLogger($"Avalonia.{area}")); var logger = _areaLoggers[area]; var logLevel = ConvertLogLevel(level); logger.Log(logLevel, messageTemplate); } public static LogLevel ConvertLogLevel(LogEventLevel level) => level switch { LogEventLevel.Verbose => LogLevel.Trace, LogEventLevel.Debug => LogLevel.Debug, LogEventLevel.Information => LogLevel.Information, LogEventLevel.Warning => LogLevel.Warning, LogEventLevel.Error => LogLevel.Error, LogEventLevel.Fatal => LogLevel.Critical, _ => LogLevel.Information }; public static LogEventLevel ConvertLogLevel(LogLevel level) => level switch { LogLevel.Trace => LogEventLevel.Verbose, LogLevel.Debug => LogEventLevel.Debug, LogLevel.Information => LogEventLevel.Information, LogLevel.Warning => LogEventLevel.Warning, LogLevel.Error => LogEventLevel.Error, LogLevel.Critical => LogEventLevel.Fatal, _ => LogEventLevel.Information }; }