From 4371011a207baad6e5df31c8f5fda65dd737e1e5 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 21 Mar 2025 16:58:38 +0500 Subject: [PATCH] Added LogToDelegate and LogToTextWriter APIs (#18472) * Added LogToDelegate and LogToTextWriter APIs * typos --- .../{TraceLogSink.cs => StringLogSink.cs} | 11 +++--- src/Avalonia.Controls/LoggingExtensions.cs | 36 +++++++++++++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) rename src/Avalonia.Base/Logging/{TraceLogSink.cs => StringLogSink.cs} (91%) diff --git a/src/Avalonia.Base/Logging/TraceLogSink.cs b/src/Avalonia.Base/Logging/StringLogSink.cs similarity index 91% rename from src/Avalonia.Base/Logging/TraceLogSink.cs rename to src/Avalonia.Base/Logging/StringLogSink.cs index a77b5d66da..f135c0cd9f 100644 --- a/src/Avalonia.Base/Logging/TraceLogSink.cs +++ b/src/Avalonia.Base/Logging/StringLogSink.cs @@ -6,15 +6,18 @@ using Avalonia.Utilities; namespace Avalonia.Logging { - internal class TraceLogSink : ILogSink + internal class StringLogSink : ILogSink { + private readonly Action _logger; private readonly LogEventLevel _level; private readonly IList? _areas; - public TraceLogSink( + public StringLogSink( + Action logger, LogEventLevel minimumLevel, IList? areas = null) { + _logger = logger; _level = minimumLevel; _areas = areas?.Count > 0 ? areas : null; } @@ -28,7 +31,7 @@ namespace Avalonia.Logging { if (IsEnabled(level, area)) { - Trace.WriteLine(Format(area, messageTemplate, source, null)); + _logger(Format(area, messageTemplate, source, null)); } } @@ -36,7 +39,7 @@ namespace Avalonia.Logging { if (IsEnabled(level, area)) { - Trace.WriteLine(Format(area, messageTemplate, source, propertyValues)); + _logger(Format(area, messageTemplate, source, propertyValues)); } } diff --git a/src/Avalonia.Controls/LoggingExtensions.cs b/src/Avalonia.Controls/LoggingExtensions.cs index f909ba8714..819f4a4b89 100644 --- a/src/Avalonia.Controls/LoggingExtensions.cs +++ b/src/Avalonia.Controls/LoggingExtensions.cs @@ -1,4 +1,7 @@ -using Avalonia.Controls; +#define TRACE +using System; +using System.Diagnostics; +using System.IO; using Avalonia.Logging; namespace Avalonia @@ -12,12 +15,39 @@ namespace Avalonia /// The minimum level to log. /// The areas to log. Valid values are listed in . /// The app builder instance. - public static AppBuilder LogToTrace( + public static AppBuilder LogToTrace(this AppBuilder builder, + LogEventLevel level = LogEventLevel.Warning, params string[] areas) => + LogToDelegate(builder, s => Trace.WriteLine(s), level, areas); + + + /// + /// Logs Avalonia events to a TextWriter + /// + /// The app builder instance. + /// The TextWriter that's used for log events. + /// The minimum level to log. + /// The areas to log. Valid values are listed in . + /// The app builder instance. + public static AppBuilder LogToTextWriter(this AppBuilder builder, TextWriter writer, + LogEventLevel level = LogEventLevel.Warning, params string[] areas) => + LogToDelegate(builder, TextWriter.Synchronized(writer).WriteLine, level, areas); + + + /// + /// Logs Avalonia events to a custom delegate + /// + /// The app builder instance. + /// The callback that's used for log events. + /// The minimum level to log. + /// The areas to log. Valid values are listed in . + /// The app builder instance. + public static AppBuilder LogToDelegate( this AppBuilder builder, + Action logCallback, LogEventLevel level = LogEventLevel.Warning, params string[] areas) { - Logger.Sink = new TraceLogSink(level, areas); + Logger.Sink = new StringLogSink(logCallback, level, areas); return builder; } }