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; } }